Android的Button按钮,ACTION_UP事件不触发解决方案
2024-08-22 09:09:14
在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;
}
});
最新文章
- 基本术语表【WF】
- 手把手教你编写Logstash插件
- C#,java,C++ 等变量命名规则
- 对象复制、克隆、深度clone
- jQuery 重新温习 遗忘知识点
- PHP二维数组根据某个键名排序
- 经典sql总结(1)
- UVA 465 (13.08.02)
- JavaScript HTML DOM 事件
- VS2012 利用正则统计项目代码行数
- iFace Chain [ 爱妃链 ] 或将凭借人脸密钥技术成为安全领域最大的赢家
- Gartner 2018 数据库系列报告发布 巨杉数据库连续两年入选
- node中间层转发请求
- MySQL5.7 GTID学习笔记,[MySQL 5.6] GTID实现、运维变化及存在的bug
- poj 2236 加点 然后判断某两点是否连通
- Java Dictionary 类存储键值
- python 基础笔记
- json在线工具
- 为免费app嵌入Admob广告
- 举一反三 willDisplayCell在UICollectionView中的一些应用