时间:2021-05-20
本博文讲解流程
TouchEvent相关事件简介
流程图分解讲解
总结与归纳
一.TouchEvent相关事件简介
android TouchEvent相关事件有
1 dispatchTouchEvent 这个方法用来分发TouchEvent
2 onInterceptTouchEvent 这个方法用来拦截TouchEvent
3 onTouchEvent 方法用来处理TouchEvent
比较特殊一点的是onInterceptTouchEvent 事件,在activity中和view中是没有这个这个事件的,因为activity本身只是一个容器或者载体,不存在对事件拦截,而view本身就是一个事件的最小单元,或最小子类,没有可以拦截的子类事件,所以他们是没有onInterceptTouchEvent事件,只有dispatchTouchEvent和onTouchEvent事件。
二.流程图分解讲解
为了更好的理解触摸事件的整个传递机制我根据事件传递绘制了一张流程图,来帮助大家理解。![这里写图片描述]
本图主要包含三层,即activity viewGroup view,按照事件的传递逐级传递。有几个要点要注意,
1.dispatchTouchEvent如果处理了本次事件,
那么他的执行顺序是这样的。这里是viewGroup的dispatchTouchEvent处理了本次事件
2.onTouchEvent 如果子view的TouchEvent没有处理本次事件,那么该事件会依次向上传递,知道有人处理,如果一直传递到activity 的onTouchEvent还是没人处理,默认本次事件结束.
核心代码
1. Activity
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } String tag = "MainActivity"; @Override public boolean dispatchTouchEvent(MotionEvent event) { String tag1 = "dispatchTouchEvent"; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println(tag + tag1 + "ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: System.out.println(tag + tag1 + "ACTION_MOVE"); break; case MotionEvent.ACTION_UP: System.out.println(tag + tag1 + "ACTION_UP"); break; } return super.dispatchTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { String tag1 = "onTouchEvent"; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println(tag + tag1 + "ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: System.out.println(tag + tag1 + "ACTION_MOVE"); break; case MotionEvent.ACTION_UP: System.out.println(tag + tag1 + "ACTION_UP"); break; } return false; }}2.viewGroup
public class MyViewGroup extends ViewGroup { public MyViewGroup(Context context) { super(context); } public MyViewGroup(Context context, AttributeSet attrs) { super(context, attrs); } String tag = "MyViewGroup"; @Override public boolean dispatchTouchEvent(MotionEvent event) { String tag1 = "dispatchTouchEvent"; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println("------>"+tag +"-->"+ tag1 + "ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: System.out.println("------>"+tag + tag1 + "ACTION_MOVE"); break; case MotionEvent.ACTION_UP: System.out.println("------>"+tag + tag1 + "ACTION_UP"); break; } return super.dispatchTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { String tag1 = "onTouchEvent"; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println("------>"+tag + tag1 + "ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: System.out.println("------>"+tag + tag1 + "ACTION_MOVE"); break; case MotionEvent.ACTION_UP: System.out.println("------>"+tag + tag1 + "ACTION_UP"); break; } return super.onTouchEvent(event); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { String tag1 = "onInterceptTouchEvent"; switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println("------>"+tag + tag1 + "ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: System.out.println("------>"+tag + tag1 + "ACTION_MOVE"); break; case MotionEvent.ACTION_UP: System.out.println("------>"+tag + tag1 + "ACTION_UP"); break; } return super.onInterceptTouchEvent(ev); }}3.view
public class MyButton extends Button { public MyButton(Context context) { super(context); } public MyButton(Context context, AttributeSet attrs) { super(context, attrs); } String tag = "MyButton"; @Override public boolean dispatchTouchEvent(MotionEvent event) { String tag1 = "dispatchTouchEvent"; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println("------>"+tag + tag1 + "ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: System.out.println("------>"+tag + tag1 + "ACTION_MOVE"); break; case MotionEvent.ACTION_UP: System.out.println("------>"+tag + tag1 + "ACTION_UP"); break; } return super.dispatchTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { String tag1 = "onTouchEvent"; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println("------>"+tag + tag1 + "ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: System.out.println("------>"+tag + tag1 + "ACTION_MOVE"); break; case MotionEvent.ACTION_UP: System.out.println("------>"+tag + tag1 + "ACTION_UP"); break; } return false; }}以上只是部分代码,但是所有事件都已列出。
总结与归纳
通过以上学习我们应该可以更加深刻的理解事件的传递机制,但是在实际的开发过程中可能我们并不会全部用到,但是我们必须知道他的运行传递原理,这样遇到特殊的业务需求时,才不会出现卡壳,实际开发中我们多只要重写onTouchEvent事件就已经能够满足需要,但是如果要重写其他事件,我们就要考虑更周到些,牵扯的会比较多。
demo点这里
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言上一篇讲了Android触摸事件的传递机制,具体可以看这里初识Android触摸事件传递机制。既然知道Android中触摸事件的传递分发,那么它能解决什么样
android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。一个最简单的屏幕触摸动作触发了一系列To
这几天遇到点关于Android的触摸事件相关的,还跟onClick有关,暂且记下:LinearLayout分别设置了onTouchListener,onClic
Android事件拦截机制Android中事件的传递和拦截和View树结构是相关联的,在View树中,分为叶子节点和普通节点,普通节点有子节点只能是ViewGr
Android--多线程之Handler前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了解决Android应用中多线程的问题