过完今天就放假了,哇哈哈,提前祝大家端午快乐,多吃粽子,公司给我们发了几个粽子,今天早上吃了个,还不错,呵呵,回到正题...之前在网上看了很多这方面的文章,有的写得很不错,然后我也决定自己也写一篇这样子的文章,一是加深理解onInterceptTouchEvent和onTouchEvent之间的关系,二是希望大家看到我写得东西能少走些弯路,本人的语文也不是很好,语文是数学老师教的,每次写文章也是跟着感觉走,呵呵
1.onInterceptTouchEvent(),Intercept 阻断,打断的意思,顾名思义这个方法是阻断TouchEvent的传递,这个方法返回值是false或者true,也许很多不了解的人就会问,阻断TouchEvent的传递是什么意思?onInterceptTouchEvent()这个方法是ViewGroup里面的方法,一个ViewGroup里面可以包含很多的ViewGroup、View,然后ViewGroup里面的View想要获得TouchEvent的话,必须是从ViewGroup传递过来的,而onInterceptTouchEvent方法就是拦截TouchEvent的,顾名思义,当onInterceptTouchEvent返回false的时候,子View就有TouchEvent,返回true的时候,子View的TouchEvent就被拦截了,TouchEvent就给ViewGroup处理,子View就没有TouchEvent
2.onTouchEvent()用于处理事件(重点onTouch这个事件是从子控件回传到父控件的,一层层向上传),返回值决定当前控件是否消费(consume)了这个事件,也就是说在当前控件在处理完Touch事件后,是否还允许Touch事件继续向上(父控件)传递。
返回false,则向上传递给父控件,详细一点就是这个touch事件就给了父控件,那么后面的up事件就是到这里touch触发,不会在传给它的子控件。如果父控件依然是false,那touch的处理就给到父控件的父控件,那么up的事件处理都在父控件的父控件,不会触发下面的。
返回true,如果是子控件返回true,那么它的touch事件都在这里处理,父控件是处理不了,因为它收不到子控件传给他的touch,被子控件给拦截了
(注:可能你会觉得是否消费了有关系吗,反正我已经针对事件编写了处理代码?答案是有区别!比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。)
下面我们结合例子来深刻理解下这两者之间的关系
1.首先我们新建一个MyLayout继承LinearLayout,我们知道onInterceptTouchEvent()是ViewGroup里面的方法,我们不直接去继承ViewGroup而是继承ViewGroup的一个导出类(子类),然后重写onInterceptTouchEvent和onTouchEvent这两个方法,onInterceptTouchEvent默认情况下返回false,即不拦截TouchEvent,onTouchEvent默认返回false,即ViewGroup默认不消费TouchEvent
package com.example.ontouchactivity; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.LinearLayout; public class MyLayout extends LinearLayout { private static final String TAG = "OnTouch"; public MyLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.e(TAG, "MyLayout----onInterceptTouchEvent"); return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Log.e(TAG, "MyLayout----DOWN"); break; case MotionEvent.ACTION_UP: Log.e(TAG, "MyLayout----UP"); break; } return super.onTouchEvent(event); } }
然后布局文件,在MyLayout里面嵌套一个TextView
<com.example.ontouchactivity.MyLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" /> </com.example.ontouchactivity.MyLayout>
MainActivity如下
package com.example.ontouchactivity; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.TextView; public class MainActivity extends Activity { private static final String TAG = "OnTouch"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView mTextView = (TextView) findViewById(R.id.text); mTextView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Log.i(TAG, "TextView----DOWN"); break; case MotionEvent.ACTION_UP: Log.i(TAG, "TextView----UP"); break; } return false; } }); } }
1.默认情况下,我们触摸下屏幕看下打印
传递顺序:MyLayout---->TextView----->MyLayout,因为onInterceptTouchEvent默认情况下返回false,即不拦截TouchEvent,所以将TouchEvent传递给TextView,而TextView返回false,即没有消费TouchEvent,没有消费就将TouchEvent向上传递给MyLayout,而MyLayout的onTouchEvent默认情况下返回是false,即也是不消费TouchEvent,所以我们看到如上的打印
2.将MyLayout的onInterceptTouchEvent返回值修改为true,拦截TouchEvent,看下打印输出
传递顺序:MyLayout----->MyLayout,我们看到TouchEvent并没有传递给TextView,而是被MyLayout给拦截了,拦截之后MyLayout会将TouchEvent传给自己,
而MyLayout的onTouchEvent默认情况下返回是false,即不消费TouchEvent,所以我们看到如上的打印
3.将MyLayout的onInterceptTouchEvent返回值修改为true,拦截TouchEvent,将MyLayout的onTouchEvent返回值修改为true看下打印输出
传递顺序:MyLayout----->MyLayout---->MyLayout,TouchEvent被MyLayout给拦截了,TouchEvent传递给自己,而onTouchEvent返回值为true,即自己消费TouchEvent,所以我们看到如上的打印
4.将MyLayout的onInterceptTouchEvent返回值修改为false,将TextView的Ontouch的返回值修改为true, MyLayout的onTouchEvent返回值false 或者 true 都无所谓,看下打印输出
传递顺序:按下MyLayout----->TextView,抬起MyLayout----->TextView,因为按下时MyLayout将TouchEvent传递给TextView,而TextView返回true,消费了TouchEvent,消费了TouchEvent就不向上传给MyLayout了,抬起也是一样
大概就是这个意思,不知道按照我思路写的文章大家看不看得懂,呵呵,写的有错误的地方还希望大家指出,谢谢
相关推荐
onInterceptTouchEvent和onTouchEvent调用关系详解
onInterceptTouchEvent与OntouchEvent之间的事件传递机制的具体内涵关系...
关于onInterceptTouchEvent和onTouchEvent使用demo,很不错的一个demo,可以帮助Android的触摸事件。
NULL 博文链接:https://2528.iteye.com/blog/1056731
NULL 博文链接:https://username2.iteye.com/blog/2193153
NULL 博文链接:https://yxwww.iteye.com/blog/1409461
本篇文章小编为大家介绍,Android onTouchEvent 与 onInterceptTouchEvent的区别详解。需要的朋友参考下
onInterceptTouchEvent 和 onTouchEvent 研究
onInterceptTouchEvent和onTouchEvent调用时序
onInterceptTouchEvent ontouchevent 的一个执行顺序和关于返回值的小demo 希望有点用
onInterceptTouchEvent与onTouchEvent事件传递的分析
(之前上传的代码有bug,经过作者整理和修改,fix掉部分bug) ...关键技术是理解清楚“onInterceptTouchEvent和onTouchEvent”的关系,以及computeScroll和dispatchDraw等。 可以在百度中搜索关键词获取答案。
基于这个猜测,我自定义一个ViewPager,重写dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent,分别在这三个方法中打印log; 重写SlidingMenu的dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent,...
onInterceptTouchEvent和onTouchEvent调用时序详解 测试demo 详细介绍请移步:http://blog.csdn.net/yiranxinshou/article/details/9201833
侧滑面板(对ViewGroup的自定义) * 应用场景: 扩展主面板的功能 ... 触摸优化: 重写ViewGroup里onInterceptTouchEvent和onTouchEvent Github 大牛 Jake Wharton nineoldandroids.jar 属性动画 ActionBarSherlock
Title : dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent三者对MotionEvent的分发、拦截机制分析 Author: yaong Category:自己做的Demo Tips : 三个自定义View,依次嵌套,并各自覆写拦截、监听方法,通过...
通过代码实践总结dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent的调用流程、顺序、及返回值对事件处理的影响。
最近在学习android的view部分,于是动手实现了一个类似ViewPager的可上下或者左右拖动的ViewGroup,中间遇到了一些问题(例如touchEvent在onInterceptTouchEvent和onTouchEvent之间的传递流程),现在将我的实现过程...
android 事件传递在很多地方被描述的很复杂,难懂,其实只要自己通过代码跟一样程序的执行过程,看一下debug日志输出,就很容易理解了,在本代码里通过更改onInterceptTouchEvent和onTouchEvent的返回值,观查debug...