Android触屏事件传递(个人实践总结)

Android触屏事件传递

一:前言

之前由于做Launcher部分,涉及到许多交互的部分,因为项目过去很长时间了,最近又在做GTS,CTS的测试与修改,好多都不熟悉甚至忘记了,结合别人的文章经验(我发现有些地方和别人有出入,但自己经测试验证),加上自己的测试,今天写下文章来总结一下。

二:关于ViewGroup与其中的view视图

ViewGroup是一个容器类,一般,布局容器是继承字它的。容器里面可以存放视图,当然也可以嵌套容器,比如Relativelayout,LinearLayout等等。我这里所说的view视图是只继承view的类,没有继承容器类(ViewGroup)。因为后面降到的事件传递的小差异和这个有关系。继承自ViewGroup的类里面有interceptTouchEvent(),而没有继承ViewGroup的类没有这个方法,这个方法是负责拦截touch事件的。

三:事件传递

1:一般,针对ViewGroup ,事件传递有三个方法。

  • dispatchTouchEvent(); 负责事件分发,如果返回值为true,表示事件不继续分发,也不进行消费(执行onTouchEvent(),如果onTouchEvent()返回true表示消费完,false表示没有消费完),然后一级一级向上执行容器类的dispatchTouchEvent(),并且每一级的返回值为true;如果dispatchTouchEvent()返回值为false,则交给父类分发给interceptTouchEvent();
  • interceptTouchEvent();负责事件拦截,如果返回false,表示不拦截,touch事件交给下一级的视图处理,如果拦截,则交给这一级的onTouchEvent()来处理;
  • onTouchEvent();负责消费事件,如果返回值为true,表示消费了事件,事件消失;如果返回值为false,则向上一级执行onTouchEvent(),如果上一级继续返回false,则继续向上,如果每一级都返回false,则进入死循环,导致ANR,android
    5.1也会死循环,我测试不会导致ANR(可能公司手机还没有适配好),为了避免这种情况,可以在Activity的onTouchEvent()返回true;
........... extends Activity{

    public boolean dispatchTouchEvent(MotionEvent ev) { 

        return true;
    }
}

2:针对不是容器类的View

  • dispatchTouchEvent(); 负责事件分发,如果返回值为true,表示事件不继续分发,也不进行消费(执行onTouchEvent(),如果onTouchEvent()返回true表示消费完,false表示没有消费完),这里注意了,一般这个View都存在于一个容器中,但是不执行父容器的dispatchTouchEvent(),而是执行父父容器的dispatchTouchEvent(),然后向上递归传递,为什么?个人觉得是:因为没有继承ViewGroup的(不是容器类),它没有子View,他和父容器的dispatchTouchEvent()处理时是调用的同一个,所以虽然有事件分发函数;如果dispatchTouchEvent()返回值为false,则交给父类分发给onTouchEvent()消费;个人感觉最好不要在dispatchTouchEvent()里面强行返回false,并且在里面做UI处理。
  • onTouchEvent();负责消费事件,如果返回值为true,表示消费了事件,事件消失;如果返回值为false,则向上一级执行onTouchEvent(),如果上一级继续返回false,则继续向上,如果每一级都返回false,则进入死循环,导致ANR,android
    5.1也会死循环,我测试不会导致ANR(可能公司手机还没有适配好),为了避免这种情况,可以在Activity的onTouchEvent()返回true;

3:关于Activity的dispatchTouchEvent()和onTouchEvent();

一个事件开始于Activity的dispatchTouchEvent()方法,并向DecorVIew(setContentView()里面的view)下面传递的.

待上图上代码

时间: 2024-10-20 03:31:25

Android触屏事件传递(个人实践总结)的相关文章

Android 触屏事件 OnTouch onClick onTouchEvent对于触屏事件的处理和分发

Android 触屏事件 OnTouch onClick onTouchEvent对于触屏事件的处理和分发 做项目的时候经常遇到需要事件分发,很多时候我们发现当我们触发了onTouch却触发不了onClick.或者触发了View的事件却触发不了ViewGroup的事件.那么他们之间到底是什么关系呢,其实最终他们涉及的只是两个问题 OnTouch .onClick .onTouchEvent 之间的关系 OnTouch .onClick .onTouchEvent 之间的处理顺序 这里,我做了简单

【Android】触屏事件传递简述

一个典型的结构模型 ActivityA包含ViewGroupB,ViewGroupB包含ViewC,这里选取ViewGroupB(中间节点)作为当前节点视角 过程一:当前节点与父节点的事件关系 ActivityA只关心ViewGroupB.onDispatchTouchEvent返回值,只要在ACTION_DOWN分发过程中B.onDispatchTouchEvent()返回为true,那么后续的事件都会向B分发.至于ViewGroupB在onDispatchTouchEvent方法中是怎么处理

Android的触屏事件

Android系统中的每个View的子类都包含的三种和touchevent有关的三种方法. ondispathTouchEvent(); 这个方法用来分发TouchEventonInterceptTouchEvent(); 这个方法用来拦截TouchEventonTouchEvent: 这个方法用来处理TouchEvent 每次触屏事件,都有最顶层的View的ondispathTouchEvent()接受,由这个方法进行分发.当方法返回true时 ,就将触屏事件传递给该View的OntouchE

android实现横竖屏8个方向触屏事件的捕捉并有相对应的动画提示

1:首先来说横竖屏的问题 这里我是在onCreate方法中直接强制横屏竖屏的设置, Button btn; SurfaceView surfaceView; //初始化布局 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); addListener(); } //初始化 pri

转:Android随笔之——使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)

本文转载自CSDN的jzj1993,原文连接:http://blog.csdn.net/jzj1993/article/details/39158865 有时我们需要使用安卓实现在后台模拟系统按键,比如对音量进行调节(模拟音量键),关闭前台正在运行的App(模拟返回键),或者模拟触屏事件.但是对于原生安卓系统而言,后台进程关闭前台进程,甚至模拟用户事件,进而操控整个系统,是不符合系统安全原则的,如果有这样的漏洞被病毒或恶意软件所利用,会非常危险. 由于一些特殊原因,我恰巧需要实现这样的功能,而又

舌尖上的安卓(android触控事件机制学习笔记录)

对于一个"我们从来不生产代码,我们只是大自然代码的搬运工"的码农来说.对android的触控机制一直是模棱两可的状态,特别是当要求一些自定义的控件和androide的自带控件(比如ViewPager,ListView,ScrollView)高度嵌套在一起使用时. 花了点时间梳理了下,做个笔记.对于一个触控的事件从用户输入到传递到Actigvity到最外层的Viewgroup在到子View,中间过程还可能穿插多个Viewgroup,android在ViewGroup提供了3个方法来控制流

移动端touch触屏滑动事件、滑动触屏事件监听!

移动端touch触屏滑动事件.滑动触屏事件监听! 一.触摸事件 ontouchstart.ontouchmove.ontouchend.ontouchcancel 目前移动端浏览器均支持这4个触摸事件,包括IE.由于触屏也支持MouseEvent,因此他们的顺序是需要注意的:touchstart → mouseover → mousemove → mousedown → mouseup → click1 Apple在iOS 2.0中引入了触摸事件API,Android正迎头赶上这一事实标准,缩小

Android: 触屏fling/scroll/drag的区别及其详细过程

Google了一下,终于搞清了touch screen下的几种操作模式(对应的是事件). 对于一个view, 常用的操作有点击(click)和长按(long press)二种.实际上,这些操作类型是Android内部在onTouchEvent(MotionEvent event)里对用户的动作做了一定的分析,从而通知应用程序是发生了点击还是长按等事件. 有时,我们需要的并不仅限于这两种操作.我们可以借助GestureDetector来分析出更细致的操作类型.基本的过程就是创建一个myGestur

View实现事件监听DEMO(文本跟随触屏事件)

View 是一个显示的视图,内置的画布通过重写Ondraw(Canvas canvas);方法获得,同时提供图形绘制函数.触屏事件.按键事件等. 现在利用一个简单的demo演示一下几个重要的常用到的方法: import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.K