文档章节

onInterceptTouchEvent()和onTouchEvent()调用关系

Nikita90
 Nikita90
发布于 2014/04/30 10:58
字数 663
阅读 649
收藏 0

在ViewGroup里覆写了onInterceptTouchEvent()方法,就可以对各种touch事件加以拦截。但是touch事件在onInterceptTouchEvent()和onTouchEvent以及各个childView间的传递机制完全取决于onInterceptTouchEvent()和onTouchEvent()的返回值。

  1. down事件首先会传递到onInterceptTouchEvent()方法。该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后:

    (1)return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。

    (2)return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。 

  2. 如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。 

  3. 如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。


实验:

<?xml version="1.0" encoding="utf-8"?> 
<com.test.LayoutView1 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <com.test.LayoutView2
        android:orientation="vertical"         
        android:layout_width="fill_parent"         
        android:layout_height="fill_parent"         
        android:gravity="center">        
        <com.test.MyTextView  
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"  
            android:text="AB"/>    
    </com.touchstudy.LayoutView2> 
</com.touchstudy.LayoutView1>
  1. onInterceptTouchEvent()处理down事件均返回false,onTouchEvent处理事件均返回true:

    LayoutView1 : onInterceptTouchEvent  action :  ACTION_DOWN

    LayoutView2 : onInterceptTouchEvent  action :  ACTION_DOWN

    MyTextView : onTouchEvent  action :  ACTION_DOWN

    LayoutView1 : onInterceptTouchEvent  action :  ACTION_MOVE

    LayoutView2 : onInterceptTouchEvent  action :  ACTION_MOVE

    MyTextView onTouchEvent  action :  ACTION_MOVE

    这是最常见的情况,onInterceptTouchEvent并没有做任何改变事件传递时序的操作,效果上和没有重写该方法一样。各种事件的传递本身是自底向上的,次序:LayoutView1 -> LayoutView2 -> MyTextView. 在onInterceptTouchEvent均返回false时,LayoutView1 和 LayoutView2 的onTouchEvent并不会接收到事件,而是最终传递给了MyTextView.

  2. LayoutView1 的onInterceptTouchEvent处理down事件返回true,MyTextView的onTouchEvent事件返回true:

    LayoutView1 : onInterceptTouchEvent  action :  ACTION_DOWN

    LayoutView1 : onTouchEvent  action :  ACTION_DOWN

    LayoutView1 : onTouchEvent  action :  ACTION_MOVE

    LayoutView1 : onTouchEvent  action :  ACTION_MOVE

    LayoutView1  : onTouchEvent  action :  ACTION_UP

    LayoutView1在拦截第一次down事件时return true,所以后续事件(包括第一次的down)将由LayoutView1本身处理,事件不再传递下去。

  3. LayoutView1,LayoutView2的onInterceptTouchEvent处理down事件返回false,MyTextView的onTouchEvent事件返回false,LayoutView2的onTouchEvent事件返回true

    LayoutView1 : onInterceptTouchEvent  action :  ACTION_DOWN

    LayoutView2 : onInterceptTouchEvent  action :  ACTION_DOWN

    MyTextView : onTouchEvent  action :  ACTION_DOWN

    LayoutView2 : onTouchEvent  action :  ACTION_DOWN

    LayoutView1 : onInterceptTouchEvent  action :  ACTION_MOVE

    LayoutView2 : onTouchEvent  action :  ACTION_MOVE

    LayoutView1 : onInterceptTouchEvent  action :  ACTION_MOVE

    LayoutView2 : onTouchEvent  action :  ACTION_MOVE


© 著作权归作者所有

共有 人打赏支持
Nikita90
粉丝 0
博文 4
码字总数 3427
作品 0
广州
程序员
android Touch事件的处理流程

作为触屏手机,触摸事件是最基本的事件,没有之一。在实际的触屏事件响应的过程中,public boolean onInterceptTouchEvent(MotionEvent ev)和public boolean onTouchEvent(MotionEvent event...

soso_fy
2013/01/30
0
5
让ViewPager不可以滚动

关于ViewPager滚动的拦截首先得知道他怎么就可以滚动了.才有可能去拦截他,不让他滚动. 那么关于触摸事件,想当然的就会想到onInterceptTouchEvent方法和onTouchEvent方法. 当一个ViewGroup的o...

-___-
2016/08/19
0
0
onInterceptTouchEvent和onTouchEvent调用时序

onInterceptTouchEvent()是ViewGroup的一个方法,目的是在系统向该ViewGroup及其各个childView触发onTouchEvent()之前对相关事件进行一次拦截,Android这么设计的想法也很好理解,由于ViewG...

yzp531
2013/04/25
0
0
Android 触摸事件分发ViewGroup&View

做笔记用,方便以后糊涂了,过来看看: 贴代码的话就太多了,但是不贴又怕以后看不明白: 子View import android.content.Context;import android.util.AttributeSet;import android.util.Lo...

Drealin
2013/06/19
0
0
Android Touch系统简介(二):实例详解onInterceptTouchEvent与onT

上一篇文章主要讲述了Android的TouchEvent的分发过程,其中有两个重要的函数:onInterceptTouchEvent和onTouchEvent,这两个函数可被重装以完成特定的逻辑。onInterceptTouchEvent的定义为于...

JayPark不作死
2014/11/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Linux下如何查看版本信息

Linux下如何查看版本信息, 包括位数、版本信息以及CPU内核信息、CPU具体型号等等,整个CPU信息一目了然。  1、# uname -a (Linux查看版本当前操作系统内核信息)   Linux localhost.l...

15834278076
29分钟前
0
0
单点登录 SSO 的实现原理

单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。 单点登录在大型网站里...

明理萝
30分钟前
1
1
虚拟机性能监控工具

前言 JVM调优流行这么一句话“无监控不调优”,因为如果没有监控,就不知道虚拟机的运行状况。更谈不上调优了,所以,学习和了解Java 虚拟机的监控工具很有必要。 概述 在Java虚拟机中经常用...

kukudeku
39分钟前
1
0
一行搞定electron和jquery冲突,electron和jquery最简单和完美的兼容方法

electron和jquery的常见报错: Uncaught ReferenceError: $ is not defined 解决方法:在jquery最末端加上这样一行判断即可. <script src="https://code.jquery.com/jquery-2.2.0.min.js"></s......

xiaogg
49分钟前
1
0
GC和内存管理

1、垃圾回收器需要关注的内容 ava运行时内存区域的各个部分中,程序计数器、虚拟机栈、本地方法栈这三个区域的生命周期和线程相关,栈中的栈帧随着方法的进入和退出执行着进栈和出栈,每一个...

京一
56分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部