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点这里

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-08-02 12:04:03

Android触摸事件传递图解的相关文章

Android触摸事件传递分析与实践

设计UI时,亲爱的交互设计师们总会有一些天马行空的想法,大多数情况下原生的控件已不能支持这些"看似简单"的交互逻辑,需要继承ListView.ViewPager.ScrollView甚至直接继承View来自定义一些特性来支撑.在处理触摸事件时,无可避免的需要重写onInterceptTouchEvent与onTouchEvent这两个方法.本文将从源码的角度,从这两个棘手的函数为切入点,对触摸事件在View中的传递逻辑进行梳理. 1.概述 本文中只简单的考虑单指触摸事件.一次触摸事件通

Android触摸事件传递机制初识

前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套ListView,都是上下滑动,这该如何解决呢,它解决的依据就是View事件的传递机制,所以开发者需要对View的事件传递机制有较深入的理解. 目录 Activity.View.ViewGroup三者关系 触摸事件类型 事件传递三个阶段 View事件传递机制 ViewGroup事件传递机制 小结 Act

Android触摸事件的应用详解

前言 上一篇讲了Android触摸事件的传递机制,具体可以看这里初识Android触摸事件传递机制.既然知道Android中触摸事件的传递分发,那么它能解决什么样的问题,在我们实际开发中如何应用,这点很重要,知道原理是为了解决问题而准备的.这篇文章的核心讲的如何解决View的滑动冲突,这个问题在日常开发中很常见,比如内部嵌套Fragment视图是左右滑动,外部用一个ScrollView来包含,可以上下滑动,如果不进行滑动冲突处理的话,就会造成外部滑动方向和内部滑动方向不一致. 目录 常见的滑动冲

触屏事件-在android触摸事件的ACTION_POINTER_UP动作中,如何知道是哪根手指抬起的?

问题描述 在android触摸事件的ACTION_POINTER_UP动作中,如何知道是哪根手指抬起的? android API level 7,在触摸事件的ACTION_POINTER_UP动作中,如何知道是哪根手指(只是两点触摸)抬起的?我需要获取留在屏幕上的手指的触摸点坐标.求各位高手解答,谢谢! 解决方案 获取第一个离开屏幕的是哪个手指 可以使用MotionEvent的getActionIndex()

源码-Android中事件传递机制原理

问题描述 Android中事件传递机制原理 我们知道,所有的控件直接或间接的继承子View,View的子类有ViewGroup,并且ViewGroup的子类也会有其他的子View,那么他们之间事件的传递机制是怎样的?对源码有研究的吗? 解决方案 android事件传递机制Android 事件的传递机制Android之事件传递机制 解决方案二: http://blog.csdn.net/pi9nc/article/details/9281829http://www.csdn123.com/html

Android View事件传递详解

一.View的dispatchTouchEvent和onTouchEvent 探讨Android事件传递机制前,明确android的两大基础控件类型:View和ViewGroup.View即普通的控件,没有子布局的,如Button.TextView. ViewGroup继承自View,表示可以有子控件,如Linearlayout.Listview这些.而事件即MotionEvent,最重要的有3个: (1)MotionEvent.ACTION_DOWN  按下View,是所有事件的开始 (2)M

Android中事件传递机制的总结

事件传递虽然算不上某个单独的知识点,但是在实际项目开发中肯定会碰到,如果不明白其中的原理,那在设计各种滑动效果时就会感到很困惑. 关于事件的传递,我们可能会有以下疑问: 事件是如何传递的 事件是如何处理的 自定义view的时候,事件也冲突了怎么解决 带着这三个疑问,我们来总结一下事件传递机制是怎么回事.   一.事件分发的原理: 1.事件是如何传递的: (1)首先由Activity分发,分发给根View,也就是DecorView(DecorView为整个Window界面的最顶层View) (2)

Android Touch事件传递机制

介绍Android Touch事件的传递机制. 不少朋友私信问到这个问题,那就推荐一篇我看到的对传递机制介绍最清楚的国外文章吧.本文略作翻译. 1.基础知识 (1) 所有Touch事件都被封装成了MotionEvent对象,包括Touch的位置.时间.历史记录以及第几个手指(多指触摸)等. (2) 事件类型分为ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,每个事

Android 触摸事件监听(Activity层,ViewGroup层,View层)详细介绍

Android不同层次的触摸事件监听 APP开发中,经常会遇到有关手势处理的操作,比如向右滑动返回上一个页面.关于触摸事件的处理,我们可以大概处理在不同的层次上. Activity层:可以看做触摸事件获取的最顶层 ViewGroup层:ViewGroup层可以自主控制是否让子View获取触摸事件 View层:可以决定自己是否真正的消费触摸事件,如果不消费抛给上层ViewGroup Activity级别的手势监听:(右滑动返回上层界面) Activity层手势监听的使用场景:一般用于当前页面中没有