面试中被问到Android多点触控,不小心被触及到盲区,作为已开发三四年的老司机,那个心酸啊!
忙里偷闲特意写个Demo熟悉下事件分发和多点触控吧,搞了半天竟然只能监听到MotionEvent.ACTION_DOWN,其他一概监听不到。先上代码:
private void test() {
imageView.setOnTouchListener(new Listener());
}
private final class Listener implements View.OnTouchListener {
private static final String TAG = "Listener";
private String temp = "默认值";
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_POINTER_DOWN:
temp = "ACTION_POINTER_DOWN";
break;
case MotionEvent.ACTION_POINTER_UP:
temp = "ACTION_POINTER_UP";
break;
case MotionEvent.ACTION_UP:
temp = "ACTION_UP";
break;
case MotionEvent.ACTION_DOWN:
temp = "ACTION_DOWN";
break;
case MotionEvent.ACTION_MOVE:
temp = "ACTION_MOVE";
break;
default:
temp = "默认值";
break;
}
Log.d(TAG, "触发行为: " + temp);
Log.d(TAG, "手指个数: " + event.getPointerCount());
return false;
}
}
无论我怎么单指移动,多指触控,打印结果只有一个ACTION_DOWN;
后来发现巨坑在返回值这一块,onTouch()返回值改为true即可监听所有事件;
下面分析下返回false和true的区别:
1.setOnTouchListener 单独使用的时候返回值需要设置为true,
这样才能保证MotionEvent.ACTION_UP的时候能获取相应的监听,而非一次监听(即每次只有一个按下的事件能被监听到)。
2.当setOnTouchListener 和 setOnClickListener 同时使用时,onTouch 的返回值要设为 false,
这样既可以保证按下,然后再抬起的时候可以被监听,并且点击事件也会被监听。