在android编程时,有时候要实现当Button一直按下的时候,执行一些逻辑代码,当按钮弹起的时候,终止这些逻辑代码的执行。
比如在设置页面的滑动开关时,不监听ACTION_CANCEL,在滑动到中间时,如果你手指上下移动,就是移动到开关控件之外,就会造成开关的按钮停顿在中间位置。
常规方式,实现这个逻辑需要注册OnTouchListener监听,OnTouchListener的OnTouch方法中代码如下:
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//按钮按下逻辑
break;
case MotionEvent.ACTION_UP:
//按钮弹起逻辑
break;
}
在一般情况下,这样写是没有问题的,但是当手指快速滑过这个Button时,就会发现只触发了ACTION_DOWN,没有触发ACTION_UP,导致按钮按下的逻辑代码一直执行。
因为当焦点移动到控件之外,会触发ACTION_CANCEL,而不是ACTION_UP,所以造成按下的逻辑一直执行。
为了解决这个问题,上述代码可以需要修改为:
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//按钮按下逻辑
break;
case MotionEvent.ACTION_UP:
//按钮弹起逻辑
break;
case MotionEvent.ACTION_CANCEL:
//按钮弹起逻辑
break;
}
ACTION_UP处理的是Button在原位置弹起,ACTION_CANCEL处理的是焦点离开Button,两者都需要处理才能解决这个问题。