android 使父控件和子控件都处理触摸事件方式

首先必须清楚android中事件的传递机制

dispatchTouchEvent->返回true:由自己的onTouchEvent处理

                                ->返回false:->

onInterceptTouchEvent->返回false:子view的dispatchTouchEvent处理

                                     ->返回true:->

onTouchEvent

系统默认是子view接收触摸事件,当子view处理时父view不会处理,

还有一个重要问题,当子view能够处理onTouch的down事件,则接下来的所有move,up事件都交给子view处理。当子view不能处理down事件,则接下来所有的move事件,up事件也不会处理。

现在我们有三种方法:

1,重写activity的dispatchTouchEvent,onTouchEvent方法

      方法:重写onTouchEvent或者dispatchTouchEvent,自己处理父view触摸事件

      优势:只要触摸在activity.setContenView的view上就会出发onTouchEvent事件,不管触摸的是子view还是父view

      劣势:一般情况下触摸弹出对话框不会触发onTouchEvent事件

2,重写父view的dispatchTouchEvent ,onInterceptTouchEvent, onTouch方法

      方法1:强制dispatchTouchEvent返回false

       结果:父view会处理事件子view不会处理

      方法2:强制onInterceptTouchEvent返回true

       结果:同1

      方法3:使用方法1或者方法2,然后自己重写onTouch事件,用来处理子View的触摸事件

                   或者在方法1、2中直接增加处理函数,不用强制返回值


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev)
    {
        if(touchListener!=null)
        {
            touchListener.onTouch(null,ev);
        }
        return super.dispatchTouchEvent(ev);
    }


       结果:虽然能实现父view与子view同时处理触摸事件,但是比较麻烦,同时如果要获取触摸坐标则需要详细计算相对位置

3,重写子view的dispatchTouchEvent , onTouch方法

          方法1强制onTouch返回false

      结果:父view和子view都能处理down事件,但是move事件和up事件父view不能处理


总结:如果涉及的view不包含对话框则使用1,如果包含对话框则使用2

你可能感兴趣的:(android应用开发)