onInterceptTouchEvent()
onInterceptTouchEvent()是用于处理事件(类似于预处理)并改变事件的传递方向。
返回flase,事件则传递给子View。由子View继续处理。子View继续从onInterceptTouchEvent()开始轮回–>如果子View的OnTouchEvent返回true,则onInterceptTouchEvent()的move、up执行.
返回true,事件则传递传递给当前的控件的onTouchEvent()处理(自己的onTouchEvent()) --> 如果自己的onTouchEvent也返回True.–>则onInterceptTouchEvent()的down、move、up执行.
onTouchEvent()
onTouchEvent()用于处理事件,返回值决定当前控件是否消费(consume)了这个事件
返回true则touch事件就是在子控件处理(consume)了。这就是子控件拦截啦~
返回false则向上传递给父控件。
听懂了嘛?应该没有吧~那我们继续结合图例来看一下。
根据大佬的参考图,也说的很清楚。所以,直接引用~
https://www.cnblogs.com/lbangel/p/3791431.html
<com.test.LayoutView1 xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.test.LayoutView2
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:gravity="center">
<com.test.MyTextView
android:layout_width="wrap_content" android:layout_height="wrap_content"
/>
</com.test.LayoutView2>
</com.test.LayoutView1>
那么首先看一下默认的触屏事件的在两个函数之间的传递流程。如下图:
如果仅仅想让MyTextView来响应触屏事件,让MyTextView的OnTouchEvent返回true,那么事件流就变成如下图,可以看到layoutview1,layoutview2已经不能进入OnTouchEvent:
另外一种情况,就是外围容器想独自处理触屏事件,那么就应该在相应的onInterceptTouchEvent函数中返回true,表示要截获触屏事件,比如layoutview1作截获处理,处理流变成如下图:
那么应用场景呢?
那我们可以想到普通的Button实现,点击按住时高亮,松开后恢复原来的。
那点击按住的时候,那就是被拦截住了。
当然我这边要看关于拖拽的List,如何实现。就是捕获点击时down事件,或者其它事件了~好了,今天的快乐学习时光结束了,我们下次再见。