事件分发机制

android事件分发机制 就是一个触摸事件发生了,从一个窗口传递到一个视图,再传递到另外一个视图,最后被消费的过程,在android中还是比较复杂的传递流程如下:

事件分发01.png 事件分发02.png
public boolean onTouchEvent(MotionEvent ev)

​ 分发流程:

先分发到activity的dispatchTouchEvent(MotionEvent ev)方法在分发到viewGroup的dispatchTouchEvent(MotionEvent ev)方法,然后viewgroup去判断要不要去拦截 onInterceptTouchEvent(MotionEvent ev),如果不拦截就继续把事件分发到到view 的dispatchTouchEvent(MotionEvent ev)方法,然后调用view的onTouchEvent(MotionEvent ev)的方法看看,view处理事件不,(如果处理就直接消费掉)如果不处理,就返回上层调用viewgroup的onTouchEvent(MotionEvent ev)方法-->(如果处理就调用外传的onTouchEvent(MotionEvent ev),如果还是不处理,事件就直接消费掉)

列:我分别在MainActivity -->MyViewGroup--MyView,写事件分发,让我们看看log日志

事件分发03_01.png 事件分发03_02.png 事件分发03_03.png 事件分发03_04.png

事件流程是先MainActivity-dispatchTouchEvent()-->在分发到MyViewGroup的dispatchTouchEvent(MotionEvent ev)->MyViewGroup没有拦截事件也就不用处理事件所以分发到-->MyView的onTouchEvent(MotionEvent ev)的方法-->MyView 也没有处理事件,所以回传到上层,最后事件自己消费掉

事件分发的分类: (就是触摸事件的分类)

MotionEvent 就是传递 事件的类 
事件分类的_02.png

一般我们使用就是 MotionEvent.ACTION_DOWN: 按下 ,MotionEvent.ACTION_MOV 移动,MotionEvent.ACTION_UP 抬起

@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {    Log.i("TAG", "MyViewGroup=====dispatchTouchEvent: ");    switch (ev.getAction()) {        case MotionEvent.ACTION_DOWN:            Log.i("TAG", "MyViewGroup 按下");            break;        case MotionEvent.ACTION_MOVE:            Log.i("TAG", "MyViewGroup 移动");            break;        case MotionEvent.ACTION_UP:            Log.i("TAG", "MyViewGroup 抬起");            break;    }    return super.dispatchTouchEvent(ev);}

如果我们拦截了事件,就要去处理事件

@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {    Log.i("TAG", "MyViewGroup=====onInterceptTouchEvent: ");    return true; //ViewGroup 拦截此事件}@Overridepublic boolean onTouchEvent(MotionEvent event) {    Log.i("TAG", "MyViewGroup=====onTouchEvent: 处理事件");    return true; //处理事件}
事件分类_03.png

拦截事件的逻辑写在onInterceptTouchEvent分发里面,根据需求判断是否拦截

效果处理方在onTouchEvent方法里面

子控件请求父控件不要拦截事件

​ 1:在dispatchTouchEvent方法里面 通过getParent()得到父控件,请求父控件不要拦截事件getParent().requestDisallowInterceptTouchEvent(true);//请求父控件不要拦截事件 (false)就是拦截事件

@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {    getParent().requestDisallowInterceptTouchEvent(true);//请求父控件不要拦截事件    Log.i("TAG", "MyViewGroup=====dispatchTouchEvent: ");    return super.dispatchTouchEvent(ev);}

我们的点击事件的处理也是在onTouchEvent方法里面判断是否处理的

事件分发_点击事件.png

默认事件的传递图解:

默认事件的传递01.png

viewpager设置不可滑动

@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {    return fasle; //不拦截}@Overridepublic boolean onTouchEvent(MotionEvent ev) {    return false; //不处理事件}

更多相关文章

  1. android监听返回按钮事件
  2. android ANR相关问题
  3. Android(安卓)View的onTouch和onClick和onLongClick事件
  4. Android(安卓)Broadcast 笔记
  5. Android分页中显示出下面翻页的导航栏的布局实例代码
  6. android textview 如何实现像新浪微博@用户的点击事件
  7. 【边做项目边学Android】手机安全卫士05_2:程序主界面,为每个条目
  8. android的各种动作事件
  9. 【Android(安卓)View事件(二)】详解事件分发机制

随机推荐

  1. Android(安卓)Activity界面切换添加动画
  2. TextView显示链接
  3. Android与webview JS 键值编码差异
  4. EditText属性简介
  5. Android(安卓)NKD环境搭建 若干问题.
  6. Android(安卓)Studio快捷键、配置 Androi
  7. Linux Kernel and Android休眠与唤醒
  8. Using Ant to Automate Building Android
  9. Android(安卓)share绘制虚线在手机上显示
  10. 【Android】入门级连接网络示例: 网页浏览