文档章节

onInterceptTouchEvent()和onTouchEvent()调用关系

Nikita90
 Nikita90
发布于 2014/04/30 10:58
字数 663
阅读 640
收藏 0
点赞 0
评论 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 ⋅ 5

让ViewPager不可以滚动

耗时半小时,其实也就那样好像. 关于ViewPager滚动的拦截首先得知道他怎么就可以滚动了.才有可能去拦截他,不让他滚动. 那么关于触摸事件,想当然的就会想到onInterceptTouchEvent方法和onTouch...

希望慢慢好起来 ⋅ 2016/08/19 ⋅ 0

Android Touch系统简介(二):实例详解onInterceptTouchEvent与onT

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

JayPark不作死 ⋅ 2014/11/11 ⋅ 0

Android 触摸事件分发ViewGroup&View

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

Drealin ⋅ 2013/06/19 ⋅ 0

onInterceptTouchEvent和onTouchEvent调用时序

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

yzp531 ⋅ 2013/04/25 ⋅ 0

ui事件冲突,取消拦截父控件的事件拦截

当手指触摸到屏幕时,系统就会调用相应View的onTouchEvent,并传入一系列的action。当有多个层级的View时,在父层级允许的情况下,这个action会一直向下传递直到遇到最深层的View。所以touch...

Carbenson ⋅ 2016/11/24 ⋅ 0

第六章 Android 开发中的View和事件分发机制

1. 概述   作为Android开发中最常见的一个控件,个人觉得有必要谈谈了。我们刚开始接触Android的时候最常见的一些基本控件就有TextView,EditText,Button......,但是细心的你会发现它们的父...

忆念成风 ⋅ 2017/11/09 ⋅ 0

android事件多图详解!

最初向要研究android事件的一些机制,是源于MultiDirectionSlidingDrawer这个widget中handler中 放置的按钮点击无效.我想可能是我用的widget没有把这个事件传播给子view吧.于是想认真的研究下...

李海珍 ⋅ 2012/04/05 ⋅ 2

自定义ViewGroup (3) 与子View之间 Touch Event的拦截与处理

在昨天的博客(自定义ViewGroup(2))中,我们解决了多个手指交替滑动带来的页面的跳动问题。但同时也还遗留了两个问题。 我们自定义的这个ViewGroup本身还不支持onClick, onLongClick事件。 ...

风荷举 ⋅ 2014/01/29 ⋅ 1

浅谈onInterceptTouchEvent、onTouchEvent与onTouch

一、onTouch onTouch是View中OnTouchListener接口中的方法,处理View及其子类被touch是的事件处理。当然,前提是touch时间能够传递到指定的view。Q1:为什么会传递不到呢?  /** Interface...

鉴客 ⋅ 2011/10/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

DevOps 资讯 | PostgreSQL 的时代到来了吗 ?

PostgreSQL是对象-关系型数据库,BSD 许可证。拼读为"post-gress-Q-L"。 作者: Tony Baer 原文: Has the time finally come for PostgreSQL?(有删节) 近30年来 PostgreSQL 无疑是您从未听...

RiboseYim ⋅ 13分钟前 ⋅ 0

Cube、Cuboid 和 Cube Segment

1.Cube (或Data Cube),即数据立方体,是一种常用于数据分析与索引的技术;它可以对原始数据建立多维度索引。通过 Cube 对数据进行分析,可以大大加快数据的查询效率 2.Cuboid 在 Kylin 中特...

无精疯 ⋅ 51分钟前 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 53分钟前 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 今天 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 今天 ⋅ 0

Redis 注册为 Windows 服务

Redis 注册为 Windows 服务 redis 注册为 windows 服务相关命令 注册服务 redis-server.exe –service-install redis.windows.conf 删除服务 redis-server –service-uninstall 启动服务 re......

Os_yxguang ⋅ 今天 ⋅ 0

世界那么大,语言那么多,为什么选择Micropython,它的优势在哪?

最近国内MicroPython风靡程序界,是什么原因导致它这么火呢?是因为他功能强大,遵循Mit协议开源么? 错!因为使用它真的是太舒服了!!! Micropython的由来,这得益于Damien George这位伟大...

bodasisiter ⋅ 今天 ⋅ 0

docker 清理总结

杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有已经停止的容器(docker rm没有加-f参数,运行中的容器不会删掉) docker rm $(docker ps -a -q) 删除所有未打 dangling 标...

vvx1024 ⋅ 今天 ⋅ 0

关于学习

以前学车的时候,教练说了这样的一句话:如果一个人坐在车上一直学,一直学,反而不如大家轮流着学。因为一个人一直学,就没有给自己留空间来反思和改进。而轮流着学的时候大家下来之后思考上...

mskk ⋅ 今天 ⋅ 0

压缩工具之gzip-bzip2-xz

win下常见压缩工具:rar zip 7z linux下常见压缩工具:zip gz bz2 xz tar.gz tar.bz2 tar.xz gzip 不支持目录压缩 gzip 1.txt #压缩。执行后1.txt消失,生成1.txt.gz压缩文件 gzip -d 1.txt....

ZHENG-JY ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部