Android App开发触摸事件中手势事件Event的分发流程讲解与实战(附源码 简单易懂)

news2024/12/25 9:03:41

需要源码或运行有问题请点赞关注收藏后评论区留言~~~

一、手势事件的分发流程

智能手机的一大革命性技术就是把屏幕变为可触摸设备,既可用于信息输入也可以用于信息输出。与手势事件有关的方法主要有以下三个

dispatchTouchEvent  进行事件分发处理 返回结果表示该事件是否需要分发

onInterceptTouchEvent  进行事件拦截处理 返回结果表示当前容器是否需要拦截该处理

onTouchEvent  进行事件触摸事件 返回结果表示该事件是否处理完毕

上述手势方法的执行者有三个

页面类  包括Activity及其派生类

容器类  包括从ViewGroup派生出的各类容器

控件类  包括从View类派生的各类控件

处理流程如下

 

经过上图的分析,常见的手势处理方法可以总结为以下三种

页面类的dispatchTouchEvent 控制事件的分发 决定把手势交给谁处理

容器类的onInterceptTouchEvent  控制事件的拦截 决定是否要把手势交给子视图处理

控件类的onTouchEvent 进行手势处理的具体处理 

 下面是对不派发事件的处理效果

点击按钮后即会出现相应效果

 

 下面是拦截事件的处理效果

 代码如下

Java类

package com.example.event;

import com.example.event.util.DateUtil;
import com.example.event.widget.NotDispatchLayout;
import com.example.event.widget.NotDispatchLayout.NotDispatchListener;

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.widget.TextView;

public class EventDispatchActivity extends AppCompatActivity implements NotDispatchListener {
    private TextView tv_dispatch_yes; // 声明一个文本视图对象
    private TextView tv_dispatch_no; // 声明一个文本视图对象
    private String desc_yes = "", desc_no = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_dispatch);
        tv_dispatch_yes = findViewById(R.id.tv_dispatch_yes);
        tv_dispatch_no = findViewById(R.id.tv_dispatch_no);
        NotDispatchLayout ndl_no = findViewById(R.id.ndl_no);
        // 设置不分发布局的事件分发监听器
        ndl_no.setNotDispatchListener(this);
        findViewById(R.id.btn_dispatch_yes).setOnClickListener(v -> {
            desc_yes = String.format("%s%s 您点击了按钮\n", desc_yes, DateUtil.getNowTime());
            tv_dispatch_yes.setText(desc_yes);
        });
        findViewById(R.id.btn_dispatch_no).setOnClickListener(v -> {
            desc_no = String.format("%s%s 您点击了按钮\n", desc_no, DateUtil.getNowTime());
            tv_dispatch_no.setText(desc_no);
        });
    }

    // 在分发触摸事件时触发
    @Override
    public void onNotDispatch() {
        desc_no = String.format("%s%s 触摸动作未分发,按钮点击不了了\n"
                , desc_no, DateUtil.getNowTime());
        tv_dispatch_no.setText(desc_no);
    }

}

拦截事件类

package com.example.event;

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.widget.TextView;

import com.example.event.util.DateUtil;
import com.example.event.widget.InterceptLayout;
import com.example.event.widget.InterceptLayout.InterceptListener;

public class EventInterceptActivity extends AppCompatActivity implements InterceptListener {
    private TextView tv_intercept_no; // 声明一个文本视图对象
    private TextView tv_intercept_yes; // 声明一个文本视图对象
    private String desc_no = "", desc_yes = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_intercept);
        tv_intercept_no = findViewById(R.id.tv_intercept_no);
        tv_intercept_yes = findViewById(R.id.tv_intercept_yes);
        InterceptLayout il_yes = findViewById(R.id.il_yes);
        // 设置拦截布局的事件拦截监听器
        il_yes.setInterceptListener(this);
        findViewById(R.id.btn_intercept_no).setOnClickListener(v -> {
            desc_no = String.format("%s%s 您点击了按钮\n", desc_no, DateUtil.getNowTime());
            tv_intercept_no.setText(desc_no);
        });
        findViewById(R.id.btn_intercept_yes).setOnClickListener(v -> {
            desc_yes = String.format("%s%s 您点击了按钮\n", desc_yes, DateUtil.getNowTime());
            tv_intercept_yes.setText(desc_yes);
        });
    }

    // 在拦截触摸事件时触发
    @Override
    public void onIntercept() {
        desc_yes = String.format("%s%s 触摸动作被拦截,按钮点击不了了\n", desc_yes,
                DateUtil.getNowTime());
        tv_intercept_yes.setText(desc_yes);
    }

}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:orientation="vertical" >

        <Button
            android:id="@+id/btn_dispatch_yes"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="这里允许分发给下级"
            android:textColor="@color/black"
            android:textSize="17sp" />

        <TextView
            android:id="@+id/tv_dispatch_yes"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@color/black"
            android:textSize="17sp" />
    </LinearLayout>

    <com.example.event.widget.NotDispatchLayout
        android:id="@+id/ndl_no"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:orientation="vertical" >

        <Button
            android:id="@+id/btn_dispatch_no"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="这里不允许发给下级"
            android:textColor="@color/black"
            android:textSize="17sp" />

        <TextView
            android:id="@+id/tv_dispatch_no"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="5dp"
            android:textColor="@color/black"
            android:textSize="17sp" />
    </com.example.event.widget.NotDispatchLayout>

</LinearLayout>

拦截事件的XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:orientation="vertical" >

        <Button
            android:id="@+id/btn_intercept_no"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="这里不拦截下级的事件"
            android:textColor="@color/black"
            android:textSize="17sp" />

        <TextView
            android:id="@+id/tv_intercept_no"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="5dp"
            android:textColor="@color/black"
            android:textSize="17sp" />
    </LinearLayout>

    <com.example.event.widget.InterceptLayout
        android:id="@+id/il_yes"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:orientation="vertical" >

        <Button
            android:id="@+id/btn_intercept_yes"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="这里拦截了下级的事件"
            android:textColor="@color/black"
            android:textSize="17sp" />

        <TextView
            android:id="@+id/tv_intercept_yes"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="5dp"
            android:textColor="@color/black"
            android:textSize="17sp" />
    </com.example.event.widget.InterceptLayout>

</LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习模型5——贝叶斯分类器

前置知识 条件概率 贝叶斯公式 &#xff08;贝叶斯模型还是很好理解的&#xff0c;主要基于高中就学到过的条件概率。&#xff09; 贝叶斯定理 P(A)&#xff0c;P(B)分别是事件A&#xff0c;B发生的概率&#xff0c;而P(A|B)是在事件A在事件B发生的前提下发生的概率&#xf…

Burpsuite实验室之点击劫持

Burpsuite实验室之点击劫持 这是BurpSuit官方的实验室靶场&#xff0c;以下将记录个人点击劫持共5个Lab的通关过程 lab1&#xff1a; Basic clickjacking with CSRF token protection 带CSRF令牌保护的基本点击劫持 目标&#xff1a;官方给了一个账号密码wiener:peter&…

小型点阵屏后台监控系统研发

目 录 一、绪论 1 &#xff08;一&#xff09;课题的研究意义 1 &#xff08;二&#xff09;设计任务及要求 1 &#xff08;三&#xff09;单片机的发展史 2 &#xff08;四&#xff09;单片机的发展趋势 3 二、系统的整体结构 5 三、单片机介绍 6 1、单片机引脚介绍 9 2、复位…

感受野计算问题

我觉得以下两篇文章&#xff0c;在感受野的含义和计算上&#xff0c;说的是比较好的。 1、深度学习&#xff1a;VGG&#xff08;Vision Geometrical Group&#xff09;论文详细讲解_HanZee的博客-CSDN博客 2、关于感受野的总结 - 知乎 我们知道一个图片经过了一个7 * 7卷积…

【论文笔记】TINYCD: A (Not So) Deep Learning Model For Change Detection

论文 标题&#xff1a;TINYCD: A (Not So) Deep Learning Model For Change Detection paper&#xff1a; https://arxiv.org/abs/2207.13159 code&#xff1a; GitHub - AndreaCodegoni/Tiny_model_4_CD: Official implementation of TINYCD: A (NOT SO) DEEP LEARNING MO…

基于聚类算法:K-means、DBSCA算法完成航空客户价值分析任务 代码+数据

1.任务描述 信息时代的来临使得企业营销焦点从产品中心转变成客户中心。具体地,对不同的客户进行分类管理,给予不同类型的客户制定优化的个性化服务方案,采取不同的营销策略。将有限的营销资源集中于高价值的客户,实现企业利润最大化。因此,如何对客户进行合理的分类成为…

喵 ~ 小程序搭建记录

喵 ~ 小程序搭建记录前言一、搭建分析1. 项目里的页面相关2. 项目里的组件相关3. 项目里的 api 相关4. 项目里的没有用到的东西5. 项目中会用到的 iconfont二、 搭建参考参考博客三、 搭建实现1. 结构搭建2.全局样式导航栏配置tabBar配置四、uniapp项目搭建 请求配置前言 喵 ~…

1702967-37-0,PSMA-617 是prostate特异性膜抗原 (PSMA) 的强有效抑制剂

【产品描述】 Vipivotide tetraxetan (PSMA-617) 是prostate特异性膜抗原 (PSMA) 的强有效抑制剂&#xff0c;其 Ki 值为 0.37 nM。Vipivotide tetraxetan (PSMA-617)由三种成分组成:药效基团Glutamate-urea-Lysine&#xff0c;螯合剂DOTA&#xff08;能够结合68Ga或177Lu&…

智慧住建工程项目监管数字化管理解决方案

在国家“放管服”大背景下&#xff0c;提高各级住房城乡建设主管部门的服务效能和依法治理水平的呼声越来越高。 住建部《“十四五”建筑业发展规划》提出&#xff0c;基于建筑产业互联网平台建设政府监管平台&#xff0c;把“新监管”提到重要位置&#xff0c;打造“工程项目监…

临时回忆啦啦啦啦

设置为private是为了防止其他类使用当前类的日志对象&#xff1b;如果当前类需要被子类继承&#xff0c;并且都使用同一个日志对象时&#xff0c;可设置为protected 。设置为static是为了让每个类中的日志对象只生成一份&#xff0c;日志对象是属于类的&#xff0c;不是属于具体…

MySQL8.0优化 - 索引的数据结构、B+树、常见索引概念、索引的代价

文章目录学习资料索引的数据结构B树常见索引概念聚簇索引特点优点缺点限制二级索引&#xff08;辅助索引、非聚簇索引&#xff09;回表联合索引Innodb的B树索引注意事项1、根页面位置万年不动2、内节点中目录项记录的唯一性3、一个页面最少存储2条记录索引的代价学习资料 【My…

计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序

项目介绍 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的…

mMED影响组蛋白甲基化和表观遗传

2019 年 8 月 8 日&#xff0c;来自美国 NIH 的 Rafael Casellas 与科罗拉多大学 Francisco J. Asturias 在 Cell 杂志上发表文章 《A Pliable Mediator Acts as a Functional Rather Than an ArchitecturalBridge between Promoters and Enhancers》&#xff0c;综合运用 CRIS…

Landsat Collection 2 数据集详细介绍(T1/T2产品差异)

Landsat Collection 2 是对 Landsat 档案的第二次主要再处理工作&#xff0c;它带来了多项数据产品改进&#xff0c;这些改进应用了数据处理、算法开发以及数据访问和分发功能方面的进步。 Landsat Collection 2 包含来自 Landsat 1-9 的 Level-1 数据和来自 Landsat 4-9 的科…

Spring IOC源码:invokeBeanFactoryPostProcessors 后置处理器详解

前言 前面篇幅介绍了Bean配置的解析过程&#xff0c;包括注解、xml配置文件的解析。下面进入refresh方法中另一个重要的节点&#xff0c;即BeanFactoryPostProcessor的注册及其执行过程。 正文 进入refresh&#xff0c;前面篇幅已经介绍了obtainFreshBeanFactory()&#xff…

说出你常用的20个linux命令,你还是只会说ls、cat那20个命令吗?3分钟让你发现新大陆

服务器排障常用命令 &#x1f34a; 博客主页&#xff1a;作者主页 &#x1f34a; 简介&#xff1a;云计算领域优质创作者&#x1f3c6;、在校期间参与众多计算机ICT相关的省赛、国赛&#xff0c;斩获系列荣誉。考取华为资深工程师、红帽工程师、阿里云ACP云计算工程等系列认证。…

java图书推荐协同过滤算法网站

目 录 摘 要 2 Abstract 3 1绪论 6 1.1背景和意义 6 1.2国内外发展现状 6 2系统技术分析 7 2.1技术选型 7 2.2 MVC模式 7 3功能分析 8 3.1系统角色 8 3.2系统用例图 8 3.3系统功能 8 3.3.1网站前台功能 8 3.3.2网站后台功能 13 4系…

使用Android辅助功能AccessibilityService实现微信自动聊天【外挂插件】

本文是使用Android辅助功能AccessibilityService实现微信自动聊天demo&#xff1b; 只是为了跟深入的了解Android辅助功能, 提高自身的动手能力。 请勿用于商用&#xff0c;或非法用途。 动手前&#xff0c;基本的准备要求&#xff1a; 聊天机器人app demo&#xff0c;去操作…

供应PEG试剂Azide-PEG-Acrylamide,N3-PEG-ACA,叠氮-聚乙二醇-丙烯酰胺

1、名称 英文&#xff1a;Azide-PEG-Acrylamide&#xff0c;N3-PEG-ACA 中文&#xff1a;叠氮-聚乙二醇-丙烯酰胺 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a; Acrylate/Acrylamide PEG Azide PEG 4、分子量&#xff1a;可定制&#xff0c;5k、2k、10k、20k、3.4k…

DarkNet网络结构

一、darknet53网络结构图 文字版&#xff1a;卷积(下采样卷积1残差块)(下采样卷积2残差块)(下采样卷积8残差块)(下采样卷积8残差块)(下采样卷积4*残差块) 不难看出&#xff0c;darknet53就是重复堆叠下采样卷积n*残差块(n为残差块的个数)这个结构而组成的。而更基本的结构就是…