Android的事件分发

来源:互联网 发布:安装阿里云的yum源 编辑:程序博客网 时间:2024/06/08 16:49

事件分发机制分为三个主要的方法
dispatchTouchEvent(MotionEvent event);事件分发
onInterceptTouchEvent(MotionEvent ev);决定是否拦截事件
onTouchEvent(MotionEvent event)处理点击事件,返回结果决定时候消耗事件

可以用下面一段你代码来描述这三者的关系

  @Override    public boolean dispatchTouchEvent(MotionEvent event) {        return super.dispatchTouchEvent(event);        boolean 拦截 = false;        if (onInterceptTouchEvent(MotionEvent ev)) {            拦截 = onTouchEvent(MotionEvent event);        } else {            拦截 = child.dispatchTouchEvent(MotionEvent event);        }        return 拦截;    }

上诉伪代码,已经将三者关系表达的淋漓尽致了,对于一个根viewgroup来说,点击事件产生后,首先会传递给它,这时dispatchTouchEvent就会被调用,如果onInterceptTouchEvent方法返回true就表示要拦截当前事件,这时这个事件就会交给ViewGroup处理,他的onTouchEvent方法就被调用,如果这个viewgroup的onInterceptTouchEvent返回false就表示他不拦截事件,这时他就会把事件传递给子元素,接着子元素的dispatchTouchEvent就会被调用,如此反复知道事件最终被处理

一个点击事件的的传递是从Activity–window–顶层的view
一般的布局都是一个ViewGroup包含一个View
也就是说事件是从一个ViewGroup传递到View,这里我们先分析ViewGroup
viewgroup包括三个方法
dispatchTouchEvent(MotionEvent event);事件分发
onInterceptTouchEvent(MotionEvent ev);决定是否拦截事件
onTouchEvent(MotionEvent event)处理点击事件,返回结果决定是否消耗事件

首先分析dispatchTouchEvent事件的分发

 if(Action==Action_DOWN||本viewgroup是否拦截事件){        if(子view 是否调用方法requestDisallowInterceptTouchEvent () 拦截){        //子类没有拦截        是否拦截 = onInterceptTouchEvent    }else{        是否拦截 = true;    }

子类requestDisallowInterceptTouchEvent请求父类不拦截,不能拦截ActionDown事件,由于ActionDown会重置标志位,ActionDown总是询问onInterceptTouchEvent

ViewGroup拦截一个事件,其他事件都会拦截,不在走onInterceptTouchEvent方法

如果ViewGroup不拦截事件 则便利子view ,如果有适合的子view,则调用子view的分发事件

如果没有合适的子view或者子view的onTouchEvent返回false ,事件就有ViewGroup处理;

View的事件分发

View一般包括俩个方法
dispatchTouchEvent(MotionEvent event);事件分发
onTouchEvent(MotionEvent event)处理点击事件,返回结果决定时候消耗事件

没有事件的拦截,只有事件处理或者不处理

如果子view设置OnTouchLisenter,则调用 ontouch 不调用 ontouchEvent,如果onTouch返回false 则调用OnTouchevent;onTouchListenter优先级比较高

如果view的clickadle 为true 则消耗事件 ontouchEvent返回true
如果view。setonclickListenter,则这个view 的Clickadle为true;
与view的是否显示无关

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

原创粉丝点击