GestureDetector.SimpleOnGestureListener不尊重视图比例因子?

时间:2015-09-18 14:24:02

标签: java android touch

我使用SimpleOnGestureListener来检测onSingleTapUp事件和视图。

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

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

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

  • Here如果触摸点未超过某个阈值,则会调用SingleTapUp()听众
  • Here 计算触摸点的行进距离

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

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

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

现在,我的解决方法是拦截View上没有比例因子的所有事件,然后将MotionEvents自己发送到具有比例因子的视图。

效果很好,如果我对Android代码的分析是否正确,我仍然感兴趣。

我正在使用android 4.4

1 个答案:

答案 0 :(得分:1)

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

只是在探索源代码时发现了一些其他信息:

  • 在变量mTouchSlopSquare中定义的距离并初始化here(存储为原始值的平方,仅用于优化)
  • 如果您将Context传递给echo off的构造函数(应该是,因为第二个已过时),那么根据this line @echo off setlocal echo Applying Perms on ACL-C-Softlib-L ICACLS "D:\Apps\Softlib" /GRANT:r "dbg\ACL-C-Softlib-L":(OI)(CI)(X,RD,GR,RC,WD,AD,WEA,GW,DE,DC,RA) /inheritance:e /T /C >nul echo Applying Perms on ACL-R-Softlib-G ICACLS "D:\Apps\Softlib" /GRANT:r "dbg\ACL-R-Softlib-G":(OI)(CI)(X,RD,RC,WD,GW,DE,DC,RA) /inheritance:e /T /C >nul >
  • 比较是在this line
  • 中完成的同一区域

解决方法

作为解决方法,我建议您访问GestureDetector的私人成员com.android.internal.R.dimen.config_viewConfigurationTouchSlop,并在此距离计算中添加比例因子。

请参阅下面的代码:

mTouchSlopSquare
GestureDetector

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