由于所有的坐标位置都是以像素计算的,没有考虑到缩放的情形,所以在不同密度的屏幕上会发生点击错位的情况。

  为了修复这个问题,解决方案是获取当前屏幕的密度和对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:  }