Android onInterceptTouchEvent与onTouchEvent调用关系

2023-10-26

概述

onInterceptTouchEvent()是用来拦截Touch事件,ViewGroup有,View没有,onTouchEvent()是Touch事件,ViewGroup与View都有。

实例讲解

当一个Touch事件发生后,会由父布局开始依次执行onInterceptTouchEvent(),如果都没有拦截,则一直往下传,直到底层的View,调用onTouchEvent(),如果一直没有消费,则再依次往上传。
这里写图片描述
自定义Layout:

package com.whu.touchevent;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.LinearLayout;

/**
 * Created by Fly on 2016/10/26.
 */
public class MyLayout extends LinearLayout{
    private static final String TAG = "MyLayout";

    public MyLayout(Context context) {
        super(context);
    }

    public MyLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                Log.i(TAG, "onInterceptTouchEvent: " + "action down");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.i(TAG, "onInterceptTouchEvent: " + "action move");
            case MotionEvent.ACTION_UP:
                Log.i(TAG, "onInterceptTouchEvent: " + "action up");
                break;
        }
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                Log.i(TAG, "onTouchEvent: " + "action down");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.i(TAG, "onTouchEvent: " + "action move");
                break;
            case MotionEvent.ACTION_UP:
                Log.i(TAG, "onTouchEvent: " + "action up");
                break;
        }
        return false;
    }
}

自定义View:

package com.whu.touchevent;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Button;

/**
 * Created by Fly on 2016/10/26.
 */
public class MyView extends Button{
    private static final String TAG = "MyView";
    public MyView(Context context) {
        super(context);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                Log.i(TAG, "onTouchEvent: " + "action down");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.i(TAG, "onTouchEvent: " + "action move");
                break;
            case MotionEvent.ACTION_UP:
                Log.i(TAG, "onTouchEvent: " + "action up");
                break;
        }
        return true;
    }
}
  1. layout的onInterceptTouchEvent和onTouchEvent都返回false,view的onTouchEvent返回false
10-26 15:33:43.241 4897-4897/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action down
10-26 15:33:43.241 4897-4897/com.whu.touchevent I/MyView: onTouchEvent: action down
10-26 15:33:43.241 4897-4897/com.whu.touchevent I/MyLayout: onTouchEvent: action down

layout没有拦截,走到view的ontouch,view没有消费,继续走,走到layout的ontouch,依然没有消费,继续向上。
2. layout的onInterceptTouchEvent和onTouchEvent都返回false,view的onTouchEvent返回true

10-26 15:38:42.885 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action down
10-26 15:38:42.885 11983-11983/com.whu.touchevent I/MyView: onTouchEvent: action down
10-26 15:38:42.933 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action move
10-26 15:38:42.933 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action up
10-26 15:38:42.933 11983-11983/com.whu.touchevent I/MyView: onTouchEvent: action move
10-26 15:38:42.949 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action move
10-26 15:38:42.949 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action up
10-26 15:38:42.949 11983-11983/com.whu.touchevent I/MyView: onTouchEvent: action move
10-26 15:38:42.957 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action move
10-26 15:38:42.957 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action up
10-26 15:38:42.957 11983-11983/com.whu.touchevent I/MyView: onTouchEvent: action move
10-26 15:38:42.965 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action move
10-26 15:38:42.965 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action up
10-26 15:38:42.965 11983-11983/com.whu.touchevent I/MyView: onTouchEvent: action move
10-26 15:38:42.966 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action up
10-26 15:38:42.966 11983-11983/com.whu.touchevent I/MyView: onTouchEvent: action up

可以看到,如果view消费了这个touch(onTouchEvent返回true),则每次都会像父布局的onInterceptTouchEvent判断是否拦截了。
3. layout的onInterceptTouchEvent返回true,layout的onTouchEvent返回false

10-26 15:41:13.790 20170-20170/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action down
10-26 15:41:13.790 20170-20170/com.whu.touchevent I/MyLayout: onTouchEvent: action down

拦截了后就不会向View传递了,但是并没有消费,所以只有down事件传递进去
4. layout的onInterceptTouchEvent和onTouchEvent都返回true

10-26 15:43:34.204 25353-25353/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action down
10-26 15:43:34.204 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action down
10-26 15:43:34.272 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action move
10-26 15:43:34.287 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action move
10-26 15:43:34.295 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action move
10-26 15:43:34.304 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action move
10-26 15:43:34.312 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action move
10-26 15:43:34.320 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action move
10-26 15:43:34.320 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action up

拦截并且消费,则down、move、up都被消费。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android onInterceptTouchEvent与onTouchEvent调用关系 的相关文章

随机推荐

  • EXCEL 数字统一转换成文本

    将excel中的数字统一转换成文本形式 即添加 1 点击数据 分列 2 分隔符号 下一步 3 选择文本识别符号 如 分号 4 选中文本 完成 转载于 https www cnblogs com vicdream p 4604012 html
  • 合宙 ESP32C3 使用micropython 驱动配套0.96寸 TFT ST7735 屏幕显示色块和文字

    合宙的esp32c3 开发板配套了0 96寸屏幕驱动板 可直接使用如下链接的代码 注意替换对应的pin脚和st7735 py文件 1 想显示色块参考如下链接 链接 合宙esp32c3 合宙air101LCD屏幕跑通microPython 2
  • hbase面试题(6)

    1 HBase来源于哪篇博文 C BigTable 2 下面对HBase的描述哪些是正确的 B C D B 是面向列的 C 是分布式的 D 是一种NoSQL数据库 3 HBase依靠 存储底层数据 A A HDFS B Hadoop C M
  • SAR目标检测数据集汇总

    SAR目标检测数据集汇总 文章目录 SAR目标检测数据集汇总 1 MSTAR 1996 2 OpenSARShip2 0 2017 3 SSDD SSDD 2020 4 AIR SARShip2 0 2019 5 SAR Ship Data
  • VScode调试php文件(详细且简单易操作)

    之前也不懂 看了网上好多帖子 按照它们步骤操作一遍之后 还是不行 头都大了 现在懂了 原来几步就搞定了 被它们搞得这么复杂 又是配置这个文件 又是配置那个文件 1 下载XAMPP Download XAMPP apachefriends o
  • Java程序员面试常问试题大全

    Java程序员面试常问试题大全 1 面向对象的特征有哪些方面 1 抽象 抽象就是忽略一个主题中与当前目标无关的那些方面 以便更充分地注意与当前目标有关的方面 抽象并不打算了解全部问题 而只是选择其中的一部分 暂时不用部分细节 抽象包括两个方
  • 详解 cryptogen 的内容和配置

    目录 1 cryptogen 模块命令说明 2 cryptogen 模块的配置文件 3 cryptogen 实例 创建测试配置文件 4 Fabric 证书文件的结构 cryptogen 模块主要用来生成组织结构和账号相关的文件 任何 Fab
  • 【react】实现数据双向绑定之不用柯里化的方式

    直接给onChange事件绑定一个箭头函数 这个箭头函数的参数就是event 在箭头函数内再调用saveFormData方法 saveFormData方法里面this setState dataType value
  • 学Python该看什么书?12本精华好书推荐!

    为了让更多想通过看书来学习Python的人能够把时间花在刀刃上 小编总结了Python目前所有热门方向上我个人觉得性价比很高 值得一看的书籍 今天小编来分享给大家 一 Python新手入门 新手学Python的话我推荐这本 Python编程
  • java:面向对象(多态中成员的特点)。

    这次我们说说多态中成员的特点 我们写这样一个代码 class Fu void method1 System out println fu method1 void method2 System out println fu method 2
  • 秒解小米bl锁 无需等待时间_小米全新系统曝光:小米9推送Android Q体验版

    点击上方蓝字订阅每日最新国产手机资讯 对于米粉来说 MIUI系统是他们坚持使用小米手机的重要原因 就在今天上午 MIUI官方微博发布消息 小米9的MIUI Android Q Beta优先体验版现已推送 已获得测试资格的朋友可以升级体验 据
  • 大厂笔试真题

    1 复数相乘 2 K个一组翻转链表 include
  • 浅谈 Python中if __name__ == ‘__main__‘:的工作原理

    为了理解if name main 的工作原理 我们需要先了解Python中的特殊变量 name 每个Python模块都有一个内置的变量 name 这个变量的值取决于如何执行模块 如果模块是被直接运行的 例如 你使用命令python mysc
  • 「网络安全」如何搭建MySQL恶意服务器读取文件?

    前言 注 本文不涉及对MySQL协议报文研究 仅讲解原理 并且做部分演示 搭建MySQL恶意服务器读取文件这件事 虽然直接利用门槛较高 但是由于在网上看到了一种比较新颖的利用方式 利用社会工程学引诱用户连接MySQL进而读取用户文件 个人觉
  • Day【4】字符串解码

    原题链接 思路 对于字符串k encoding 对于这样的形式 我们要加encoding重复k次 从左向右扫描字符串 如果说遇见字符 就直接将该字符添加到结果中 如果说 遇见 k encoding 的形式 我们首先要做的是就是将k和enco
  • GCC参数详解

    gcc and g 分别是gnu的c c 编译器 gcc g 在执行编译工作的时候 总共需要4步 1 预处理 生成 i的文件 预处理器cpp 2 将预处理后的文件不转换成汇编语言 生成文件 s 编译器egcs 3 有汇编变为目标代码 机器代
  • 9.OB4.0调用存储过程通过临时表返回多行记录

    MYSQL存储过程返回多行 1 表数据准备 drop table if exists t1 drop table if exists t2 drop table if exists t3 create table t1 id varchar
  • 任何程序都必须加载到什么中才能被cpu执行

    任何程序都必须加载到内存中才能被cpu执行 内存是计算机中的重要部件之一 它是外存与cpu进行沟通的桥梁 计算机中所有程序的运行都在内存中进行 内存性能的强弱影响计算机整体发挥的水平 任何程序都必须加载到内存中才能被cpu执行 学习视频分享
  • WPF 性能优化建议

    本章讲述 WPF 性能优化建议 20180930 WPF性能优化问题 运行软件发现CPU使用率很大 80 95 程序中含有委托 线程 定时器的处理 之前优化时 主要优化线程和定时器相关线程方面的处理 但是效果甚微 无意间看到博客中说程序界面
  • Android onInterceptTouchEvent与onTouchEvent调用关系

    概述 onInterceptTouchEvent 是用来拦截Touch事件 ViewGroup有 View没有 onTouchEvent 是Touch事件 ViewGroup与View都有 实例讲解 当一个Touch事件发生后 会由父布局开