由于所有的坐标位置都是以像素计算的,没有考虑到缩放的情形,所以在不同密度的屏幕上就会发生点击错位的情况。
为了修复这个问题,解决方案就是获取当前屏幕的密度和对dpi计算大小的控件的缩放比例,然后恢复原始的比例再发送点击消息:
1: // 需要传递要点击的控件View的实例 2: public void clickOnScreen(View view, boolean longClick, int time) { 3: if(view == null) 4: Assert.assertTrue("View is null and can therefore not be clicked!", false); 5: int[] xy = new int[2]; 6: 7: // 获取控件在屏幕上的位置 – 如果是dpi计算大小的控件,这个位置是缩放后的位置 8: view.getLocationOnScreen(xy); 9: 10: // 获取控件的大小,并且计算出点击的控件中点位置 11: final int top = view.getTop(); 12: final int viewWidth = view.getWidth(); 13: final int viewHeight = view.getHeight(); 14: float x = xy[0] + (viewWidth / 2.0f); 15: float y = xy[1] + (viewHeight / 2.0f); 16: 17: // 计算缩放比例,将要点击的x, y坐标恢复到缩放前的情况。 18: Activity activity = activityUtils.getCurrentActivity(); 19: DisplayMetrics rdm = activity.getResources().getDisplayMetrics(); 20: DisplayMetrics wdm = new DisplayMetrics(); 21: activity.getWindowManager().getDefaultDisplay().getMetrics(wdm); 22: x *= wdm.scaledDensity / rdm.scaledDensity; 23: y *= wdm.scaledDensity / rdm.scaledDensity; 24: 25: // 最后再发送Android点击消息 26: if (longClick) 27: clickLongOnScreen(x, y, time); 28: else 29: clickOnScreen(x, y); 30: } |