android 的这个事件的分发传递,处理的解决方式,
实质应该是 java设计模式里面的 责任链模式了。

在这里,想用最少的话,最通俗易懂的方式记录

  1. View的方法
// 事件分发,默认返回false public boolean dispatchTouchEvent(MotionEvent event) // 事件处理,默认返回false public boolean onTouchEvent(MotionEvent event) 
  1. ViewGroup的方法
// 事件分发,默认返回false public boolean dispatchTouchEvent(MotionEvent event) // 事件处理,默认返回false public boolean onTouchEvent(MotionEvent event)  // 拦截默认,默认返回false// 返回true 就不会往下传递事件,自己onTouchEvent处理// 返回false 向下传递事件public boolean onInterceptTouchEvent(MotionEvent ev)

当触发一个事件,父布局会优先得到这个事件进行分发,也就是一般的

单独View (如果设置了OnTouchListener)

dispatchEvent–setOnTouchListener–onTouchEvent

单独看ViewGroup (如果设置了OnTouchListener)

dispatchTouchEvent –onInterceptTouchEvent–setOnTouchListener– onTouchEvent

3.ViewGroup 嵌套View
也就是我们平常最有用最关心的
前面说了底层的View能够接收到这次的事件有一个前提条件:在父层级允许的情况下。假设不改变父层级的dispatch方法,在系统调用底层onTouchEvent之前会先调用父View的onInterceptTouchEvent方法判断,父层View是不是要截获本次touch事件之后的action。
所以下面的这个东西一定要分清楚,这个还是很重要的,很多人很模糊,或者说很ran

事件的分发上的执行顺序:
(父)dispatchTouchEvent

(父)onInterceptTouchEvent

(子)dispatchEvent

事件的处理执行顺序
(子)onTouchEvent

(父)onTouchEvent

4 如果父View 和 子View都设置的点击事件相应的问题了

其实是都可以响应的,不多说,ListView中的adapter item布局都写的多了。

5 requestDisallowInterceptTouchEvent

requestDisallowInterceptTouchEvent 是ViewGroup类中的一个公用方法
Called when a child does not want this parent and its ancestors to intercept touch events with ViewGroup.onInterceptTouchEvent(MotionEvent).
This parent should pass this call onto its parents. This parent must obey this request for the duration of the touch (that is, only clear the flag after this parent has received an up or a cancel.

实际的应用中,可以在子view的ontouch事件中注入父ViewGroup的实例,并调用requestDisallowInterceptTouchEvent去阻止父view拦截点击事件
原来listView 第一行, 嵌套ViewPager ,其他行嵌套别的中就需要用到这个

需要在子布局中操作,父布局不拦截自身事件

@Override    public boolean dispatchTouchEvent(MotionEvent ev) {        //让父类不拦截触摸事件就可以了。        this.getParent().requestDisallowInterceptTouchEvent(true);         return super.dispatchTouchEvent(ev);    }

更多相关文章

  1. android从fragment进入activity再返回实现刷新fragment的做法
  2. Android(安卓)8.0以上 竖屏到横屏 返回时出现错误的解决办法
  3. android中scrollview与webview冲突事件
  4. Android(安卓)-UriMatcher,ContentUris
  5. Android(安卓)Studio 触摸屏事件
  6. arcgis for android 学习 - (4) 了解mapView的一些方法和事件
  7. Android触屏事件处理流程浅析
  8. UI篇--布局问题
  9. 调用android系统相机拍照并保存图片

随机推荐

  1. Java源码的理解
  2. 我可以在测试运行时跳过JUnit测试吗?
  3. 为什么40亿次迭代的Java循环只需要2毫秒?
  4. [java混淆器问题] 如何让web项目的class
  5. JSP访问类实例
  6. eclipse写javaweb工程时文件目录为WebCon
  7. 启动非java虚拟机方式下运行matlab
  8. 转贴:JavaScript实现Ajax请求简单示例
  9. java之finally的用法
  10. 域对象/服务和业务逻辑层