Android touch事件分发

跟touch事件相关的3个方法:

public boolean dispatchTouchEvent(MotionEvent ev); //用来分派event

public boolean onInterceptTouchEvent(MotionEvent ev); //用来拦截event

public boolean onTouchEvent(MotionEvent ev); //用来处理event

三个方法的用法:

dispatchTouchEvent() 用来分派事件。

其中调用了onInterceptTouchEvent()和onTouchEvent(),一般不重写该方法

onInterceptTouchEvent() 用来拦截事件。

ViewGroup类中的源码实现就是{return false;}表示不拦截该事件,

事件将向下传递(传递给其子View);

若手动重写该方法,使其返回true则表示拦截,事件将终止向下传递,

事件由当前ViewGroup类来处理,就是调用该类的onTouchEvent()方法

onTouchEvent() 用来处理事件。

返回true则表示该View能处理该事件,事件将终止向上传递(传递给其父View);

返回false表示不能处理,则把事件传递给其父View的onTouchEvent()方法来处理

【注】:ViewGroup的某些子类(GridView、ScrollView…)重写了onInterceptTouchEvent()方法,当发生ACTION_MOVE事件时,返回true进行拦截。

拥有这三个方法的类:

Activity        :dispatchTouchEvent();   onTouchEvent();

ViewGroup       :dispatchTouchEvent();   onInterceptTouchEvent();   onTouchEvent();

View         :dispatchTouchEvent();   onTouchEvent();

现在重写  activity ViewGroup  View 的相应方法,构造布局。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.event.MyViewGroup
        android:id="@+id/myViewGroup"
        android:background="@color/colorPrimary"
        android:layout_width="400dp"
        android:layout_height="400dp">

        <com.event.MyView
            android:id="@+id/myView"
            android:layout_width="200dp"
            android:layout_height="200dp" />
    </com.pig.event.MyViewGroup>

</android.support.constraint.ConstraintLayout>

1、点击空白处(activity),输出:

activity   dispatchTouchEvent:
activity   onTouchEvent: 

直接点击  activity  触发  activity相应方法。与 内部控件无关

2、点击蓝色部分(ViewGroup),输出:(当我们手动设置OnTouchListener  并且返回true时,会拦截事件, onTouchEvent不会触发   )

 activity   dispatchTouchEvent:
 group dispatchTouchEvent:
 group  onInterceptTouchEvent:
 group  onTouch:  (OnTouchListener 部分)
 group onTouchEvent:
 activity   onTouchEvent: 

(1)由于activity没有拦截事件的方法,事件肯定会传进ViewGroup。

(2)ViewGroup 中的onTouchEvent 默认返回fasle  表示事件未处理完,则会触发activity的onTouchEvent

3、点击按钮(View),输出:(当我们手动设置OnTouchListener  并且返回true时,会拦截事件, onTouchEvent不会触发   )

 activity   dispatchTouchEvent:
 group dispatchTouchEvent:
 group  onInterceptTouchEvent:
 view   dispatchTouchEvent:
 view   onTouch: (OnTouchListener 部分)
 view  onTouchEvent: 

(1)activity分发事件进ViewGroup ,ViewGroup分发事件时,选择是否拦截事件,若不拦截则分发事件到View,若拦截事件,ViewGroup自己将事件处理,View不会接收到事件。

(2)view 的onTouchEvent默认返回true ,表示事件以处理完,不会触发ViewGroup  和 activity 的onTouchEvent。

#s3gt_translate_tooltip_mini { display: none !important }

原文地址:https://www.cnblogs.com/the-wang/p/9842678.html

时间: 2024-10-07 21:58:38

Android touch事件分发的相关文章

Android Touch事件分发过程

虽然网络上已经有非常多关于这个话题的优秀文章了,但还是写了这篇文章,主要还是为了加强自己的记忆吧,自己过一遍总比看别人的分析要深刻得多.那就走起吧. 简单演示样例 先看一个演示样例 : 布局文件 : <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id=&q

Android Touch事件分发详解

Android Touch事件分发详解 先说一些基本的知识,方便后面分析源码时能更好理解. - 所有Touch事件都被封装成MotionEvent对象,包括Touch的位置.历史记录.第几个手指等. 事件类型分为ACTION_DOWN,ACTION_UP,ACTION_MOVE,ACTION_POINTER_DOWN,ACTION_POINTER_UP,ACTION_CANCEL, 每个 一个完整的事件以ACTION_DOWN开始ACTION_UP结束,并且ACTION_CANCEL只能由代码引

Android Touch事件分发机制学习

Android  事件分发机制 ViewGroup dispatchTouchEvent 返回true dispatchTouchEvent: Activity ACTION_DOWN MyrelativeLayout dispatchTouchEvent: ACTION_DOWN dispatchTouchEvent: Activity ACTION_UP MyrelativeLayout dispatchTouchEvent: ACTION_UP ViewGroup自己在dispatchTo

android touch事件分发流程

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha 三个方法:分发触摸事件dispatchTouchEvent.在触摸事件的时候onTouchEvent.在拦截触摸事件的时候onInterceptTouchEvent. dispatch是派遣的意思. 就是分发的意思.  分发触摸事件. intercept 是拦截的意思. on 不仅有 在什么之上的意思,还有 在什么时候的意思. 触摸事件通常从 活动activity 通过 分发触摸事件

android touch事件分发机制

转载请注明出处:http://blog.csdn.net/ZhouLi_CSDN/article/details/45878337 看了网上那么多的博客 ,对于android系统的事件处理仍然不是明白的特别透彻,或者一些博客讲解的总是有些歧义或者讲诉的不正确或者不全面.所以自己总结了一下事件的传递机制希望可以帮助到广大的朋友. 假设事件传送路径为A-B-C-D-E; 一个手势是由事件action_down开始和action_move等其它事件以及事件action_up结束的集合: 一个actio

Android触摸事件分发

Android的触摸分发机制和如何实现拦截 Android的触摸分发机制和如何实现拦截 前言 触摸事件的分发 情景分析 总结 前言 在自定义ViewGroup中,有时候需要实现触摸事件拦截,比如ListView下拉刷新就是典型的触摸事件拦截的例子.触摸事件拦截就是在触摸事件被parent view拦截,而不会分发给其child,即使触摸发生在该child身上.被拦截的事件会转到parent view的onTouchEvent方法中进行处理.但是这个交互过程还是挺复杂的,有多种情况,今天我们就来分

Android 源码解析View的touch事件分发机制

概述 本篇主要分析的是touch事件的分发机制,网上关于这个知识点的分析文章非常多.但是还是想通过结合自身的总结,来加深自己的理解.对于事件分发机制,我将使用两篇文章对其进行分析,一篇是针对View的事件分发机制解析,一篇是针对ViewGroup的事件分发机制解析.本片是对View的事件分发机制进行解析,主要采用案例结合源码的方式来进行分析. 前言 在分析事件分发机制之前,我们先来学习一下基本的知识点,以便后面的理解. View中有两个关键方法参与到Touch事件分发 dispatchTouch

Android开发之Touch事件分发机制

原地址http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在ViewGroup内,ViewGroup也可以在其他ViewGroup内,这时候把内部的ViewGroup当成View来分析. ViewGroup的相关事件有三个:onInterceptTouchEv

Android:30分钟弄明白Touch事件分发机制

转载: 原文地址  点击打开链接 http://www.cnblogs.com/linjzong/p/4191891.html PS: 对照原文, 添加了一些文字, 表达更清晰(对本人来说) ---------------------------------------------质朴的分割线--------------------------------------------- Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部