利用dispatchSetPressed方法实现自定义监听onClick事件
来源:互联网 发布:linux setup配置网络 编辑:程序博客网 时间:2024/05/14 14:49
在第一篇博客中,笔者测试后发觉一个bug,就是viewgroup的每个子view若定义onClick事件,则dispatchSetPressed方法无效,也就意味着,view只相应了click事件,自身的press事件及状态未相应,具体的原因肯定是touch的一大串分发流程用以判断点击,长按,press等等事件,若对源码逻辑不是特别熟悉,改起来比较麻烦,故可以试着屏蔽onclick事件,改由其他方法实现click事件即可,但由于action_down事件后就会执行dispatchSetPressed方法,该方法return true后,viewgroup的action_up事件无法捕捉,因此想通过down事件和up事件判断x,y坐标的方法去判断是否为点击事件不可行。
找了下资料发觉,其实在Android的触摸消息中,已经实现了三种监测,它们分别是
1)pre-pressed:对应的语义是用户轻触(tap)了屏幕
2)pressed:对应的语义是用户点击(press)了屏幕
3)long pressed:对应的语义是用户长按(long press)了屏幕
在源码中是由viewConfiguration类定义的几个时间变量,在115之内 判断为tap事件,>500则认为是longpress事件,故click事件的时间在115~500.
因此可在dispatchSetPressed方法中对此进行判断,这样既可以实现pressed事件的检测,也可以实现onClick事件。
方法如下:
1.在viewgroup的touch事件中记录下action_down的时间
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
down_time = System.currentTimeMillis();
System.out.println("down_time" + down_time);
}
}
2.在dispatchSetPressed方法中,在pressed值为false的时候进行判断
@Override
protected void dispatchSetPressed(boolean pressed) {
if (pressed) {
} else {
String tag = "";
for (int i = 0; i < vCard.getChildCount(); i++) {
ViewGroup viewGroup = (ViewGroup) vCard.getChildAt(i);
tag = (String) viewGroup.getTag();
if (tag != null && tag.equals("1")) {
viewGroup.setPressed(pressed);
viewGroup.setTag("0");
long now_time = System.currentTimeMillis();
System.out.println("now_time" + now_time);
if (now_time - down_time > 150) {
Toast.makeText(mContext, "onClick", Toast.LENGTH_SHORT)
.show();
}
}
}
}
}
这这里我取值为150,具体数值可以自己测试几次,取一个合适的数值,基本偏差不大~
- 利用dispatchSetPressed方法实现自定义监听onClick事件
- 利用接口实现自定义监听事件以及观察者模式
- 详细代码实现 Button的监听事件的Onclick的三种方法
- Android onClick事件三种实现方法
- android onClick方法改造实现双击事件
- Android onClick事件三种实现方法
- Android onClick事件三种实现方法
- 按钮的监听事件--onClick
- Android之OnClick事件监听
- quick-cocos2d 中自定义事件监听方法
- 监听Touch事件自定义属性实现Selector
- android学习记录 Onclick事件监听
- 【NGUI】监听按钮除OnClick外其他事件的方法,附简易改编的UIButton类
- Android 实现事件监听的两个方法
- android三种方法实现监听事件
- 实现监听事件的三种方法。
- android 三种方法实现监听事件
- EditText自定义监听方法实现onFocusChanged的监听
- 应用服务队列开发
- HQL自己设置显示记录条数
- struts2通用配置
- yii生成验证码
- 优化UITableView性能
- 利用dispatchSetPressed方法实现自定义监听onClick事件
- WDM Filter 驱动的一点基础知识
- Linux下的多进程间共享资源的互斥访问
- 百度翻译API的调用
- 如何在.net应用中添加Email
- Http get,post,soap协议的区别
- C++中protected的访问权限
- java反射
- 枚举