简述 Android 触摸屏手势识别
2010-04-20 06:02:00 来源:WEB开发网01.@Override
02.public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
03. float velocityY) {
04. // 参数解释:
05. // e1:第1个ACTION_DOWN MotionEvent
06. // e2:最后一个ACTION_MOVE MotionEvent
07. // velocityX:X轴上的移动速度,像素/秒
08. // velocityY:Y轴上的移动速度,像素/秒
09.
10. // 触发条件 :
11. // X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒
12.
13. if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE
14. && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
15. // Fling left
16. Toast.makeText(this, "Fling Left", Toast.LENGTH_SHORT).show();
17. } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE
18. && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
19. // Fling right
20. Toast.makeText(this, "Fling Right", Toast.LENGTH_SHORT).show();
21. }
22.
23. return false;
24.}
问题是,这个时候如果我们尝试去运行程序,你会发现我们根本得不到想要的结果,跟踪代码的执行的会发现onFling()事件一直就没有被捕捉到。这正是一开始困扰我的问题,这到底是为什么呢?
我在讨论组的Gesture detection这个帖子里找到了答案,即我们需要在onCreate中tv.setOnTouchListener(this);之后添加如下一句代码。
1.tv.setLongClickable(true);
只有这样,view才能够处理不同于Tap(轻触)的hold(即ACTION_MOVE,或者多个ACTION_DOWN),我们同样可以通过layout定义中的android:longClickable来做到这一点。
这次遇到的这个问题和上次MapView中setOnKeyListener遇到的问题挺类似,其实都是对SDK的了解不够全面,遇到了一次记住了就好。不过话说回来,Google在文档方面确实需要加强了,起码可以在OnGestureListener中说明需要满足那些条件才可以保证手势被正确识别。
更多精彩
赞助商链接