Android的Button按钮,ACTION_UP事件不触发解决方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android的Button按钮,ACTION_UP事件不触发解决⽅案
在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,两者都需要处理
,才能解决这个问题。
⽰例(我这个是在按下的时候,让按钮放⼤,⼿抬起的时候缩⼩操作):
login_with_sina.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.println("++++++key_down");
AnimUtil.showOnFocusAnimation(login_with_sina);
break;
case MotionEvent.ACTION_UP:
System.out.println("++++++key_down");
AnimUtil.showLooseFocusAinimation(login_with_sina);
break;
case MotionEvent.ACTION_CANCEL:
System.out.println("++++++key_down");
AnimUtil.showLooseFocusAinimation(login_with_sina);
break;
}
return true;
}
});。