gpt4 book ai didi

java - GestureDetector.SimpleOnGestureListener 不考虑 View 比例因子?

转载 作者:太空狗 更新时间:2023-10-29 14:05:31 27 4
gpt4 key购买 nike

我正在使用 SimpleOnGestureListener检测 onSingleTapUp事件和 View 。

View 的比例因子为 5,因此 1 个屏幕像素对应于我 View 中的 5 个像素:

  view.setScaleX(5);
view.setScaleY(5);

我面临的问题是没有准确检测到 Tap 事件。我查看了SimpleOnGestureListener的源码,相关部分是:

  • Here SingleTapUp() 监听器在触摸点未移动超过特定阈值时调用
  • Here计算触摸点的移动距离

我认为不能可靠地检测到 Tap 的原因是触摸点的距离计算依赖于 View 的缩放局部坐标(e.getX()e .getY()) 而不是原始坐标(e.getRawX()e.getRawY())。

由于比例因子,手指在屏幕上的微小移动将导致 e.getX()e.getY() 发生较大变化。

我对代码的解释是否正确?如果是这样,我该如何解决这个问题?

目前,我的解决方法是拦截没有比例因子的 View 上的所有事件,然后自己将 MotionEvents 调度到具有比例因子的 View 因素。

它运行良好,我仍然对我对 android 代码的分析是否正确感兴趣。

我用的是安卓4.4

最佳答案

恕我直言,您对代码的分析是正确的!

只是在探索源代码时发现的一些额外信息:

  • 变量中定义的距离mTouchSlopSquare并初始化 here (存储为原始值的平方,仅用于优化)
  • 如果您将 Context 传递给 GestureDetector 的构造函数(应该是,因为第二个已过时),则此值等于 com.android.internal.R.dimen.config_viewConfigurationTouchSlop 根据 this line
  • 比较是在 this line 中完成的同一区域触摸

解决方法

作为解决方法,我建议您访问 GestureDetector 的私有(private)成员 mTouchSlopSquare 并在此距离计算中添加比例因子。

请参阅下面的代码:

// Utility method
public static boolean fixGestureDetectorScale(GestureDetector detector, float scale) {
try {
Field f = GestureDetector.class.getDeclaredField("mTouchSlopSquare");
f.setAccessible(true);

int touchSlopSquare = (int) f.get(detector);
float touchSlop = (float) Math.sqrt(touchSlopSquare);
//normalize touchSlop
touchSlop /= scale;
touchSlopSquare = Math.round(touchSlop * touchSlop);
f.set(detector, touchSlopSquare);

} catch (NoSuchFieldException e) {
e.printStackTrace();
return false;
} catch (IllegalAccessException e) {
e.printStackTrace();
return false;
}
return true;
}

    // usage
fixGestureDetectorScale(mGestureDetector, scale);
view.setScaleX(scale);
view.setScaleY(scale);

我已经检查过了,它对我有用。

关于java - GestureDetector.SimpleOnGestureListener 不考虑 View 比例因子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32654416/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com