之前项目中做一个竖直方向的ViewPager效果(详见我的另一篇博文),这几天做了几个改动,突然发现我设置的OnTouchListener对触摸事件的监听突然不起作用了,琢磨了半天觉得问题就出在onTouch的返回值true还是false上,后来自己测试的时候发现不光与这个有关,与OnClickListener也有关,我自己做了一些测试并尝试来进行源码的分析,解析真正的规律和原因所在。
1、一个简单的测试
为了弄懂这个问题,我们先来做一个简单的测试,寻找一下其中的规律,我们在布局中加一个很简单的view,然后给他设置一个OnTouchListener,根据onTouch函数返回值分别测一下结果
(1)全部返回false
View view = findViewById(R.id.id_view_test);
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN){
Log.d("test", "DOWN");
} else if(motionEvent.getAction() == MotionEvent.ACTION_MOVE){
Log.d("test", "MOVE");
} else if (motionEvent.getAction() == MotionEvent.ACTION_UP){
Log.d("test", "UP");
}
return false;
}
});
然后我们测试一下一次滑动的结果,发现输出只有DOWN操作:
11-05 21:27:46.453 17673-17673/com.test.lee.touchtestapplication D/test: DOWN
(2)DOWN操作时返回true,其他都返回false
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN){
Log.d("test", "DOWN");
return true; //DOWN时返回true
} else if(motionEvent.getAction() == MotionEvent.ACTION_MOVE){
Log.d("test", "MOVE");
} else if (motionEvent.getAction() == MotionEvent.ACTION_UP){
Log.d("test", "UP");
}
return false;
}
测试结果发现只要DOWN返回true,无论之后返回什么,直到UP的所有操作都收到了:
11-05 21:33:47.084 17673-17673/com.test.lee.touchtestapplication D/test: DOWN
11-05 21:33:47.169 17673-17673/com.test.lee.touchtestapplication D/test: MOVE
11-05 21:33:47.188 17673-17673/com.test.lee.touchtestapplication D/test: MOVE
11-05 21:33:47.206 17673-17673/