android View的点击事件分发机制的简单认知

对MotionEvent事件的分发过程称为点击事件的分发。点击事件的分发过程由三个很重要的方法来共同完成:dispatchTouchEventonInterceptTouchEventonTouchEvent

dispatchTouchEvent

public boolean dispatchTouchEvent(MotionEvent ev)

Touch 事件发生时 ,事件最先传到当前Activity 的 dispatchTouchEvent(MotionEvent ev) 方法,由它来进行事件的分发(从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递)

onInterceptTouchEvent

public boolean onInterceptTouchEvent(MotionEvent ev)

在dispatchTouchEvent法内部调用,用来判断是否拦截某个事件,如果当前View拦截某个事件,那么同一个事件序列当中,此方法不再调用。返回结果表示是否拦截当前事件。如果不拦截,这个事件将会传递当该View的子View的dispatchTouchEvent中,继续往下传递。

onTouchEvent

public boolean onTouchEvent(MotionEvent ev)

当前View拦截某个事件即onInterceptTouchEvent方法返回true,如果该View设置了OnClickListener,则onTouch会被调用,否则onTouchEvent会被调用。也就是说onTouch优先级大于onTouchEvent,onTouchu会屏蔽掉onTouchEvent。true表示消耗此事件,false,则该事件会被传到父控件的onTouchEvent中。

引用Android开发艺术探索书中的一段伪代码,可以将上述三个方法的关系表现的完美。

public boolean dispatchTouchEvent(MotionEvent ev){   boolean consume = false;   if(onInterceptTouchEvent(ev)){     consume = onTouchEvent(ev);   } else {     consume = childView.dispatchTouchuEvent(ev);   }     return consume;}

相关资料:Android开发艺术探索书

更多相关文章

  1. butterknife使用方法
  2. Android(安卓)的网络编程(4)-HttpClient接口
  3. Android入门进阶教程(20)-ContentProvider 数据共享
  4. ServiceManager & SystemService
  5. Android打开MyEclipse报错:发现了以元素 'd:skin' 开头的无效内容
  6. Android(安卓)源码 URLUTIL 判断文件类型问题
  7. Android中比较常见的Java super关键字
  8. HTTP下载文件时getContentLength()返回-1
  9. Android(安卓)常用的工具类集

随机推荐

  1. android 获取sd卡根目录
  2. Android 获得当前进程PackageName
  3. android 4.0 屏蔽home键实现
  4. Android VelocityTracker使用总结
  5. android 轮播图无限循环,自动播放
  6. android Handler内存泄露 kotlin内存泄露
  7. Android(安卓)setbackgroundcolor()方法
  8. Android点击EditText以外区域隐藏键盘Fra
  9. Android 搜索不到蓝牙设备
  10. Android保持屏幕常亮的方法总结