Android触摸事件传递图解
本博文讲解流程
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点这里
您可能感兴趣的文章:Android触摸事件如何实现笔触画布详解Android中View位置和触摸事件详解Android触摸事件传递机制Android在Fragment中实现监听触摸事件Android触摸事件传递机制初识Android触摸事件的应用详解Android 触摸事件监听(Activity层,ViewGroup层,View层)详细介绍Android 的触摸事件详解及示例代码android中处理各种触摸事件的方法浅谈Android触摸事件和mousedown、mouseup、click事件之间的关系
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341