利用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,具体数值可以自己测试几次,取一个合适的数值,基本偏差不大~


原创粉丝点击