Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)

news2024/12/24 9:01:53

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

一、单点触摸

dispatchTouchEvent onInterceptTouchEvent onTouchEvent三个方法的输入参数都是手势事件MotionEvent,其中包含触摸动作的所有信息,各种手势操作都从MotionEvent中获取触摸信息并判断处理。 下面是MotionEvent的常用方法

getAction  获取当前的动作类型 取值如下

ACTION_DOWN   按下动作

ACTION_UP   提起动作

ACTION_MOVE  移动动作

ACTION_CANCEL   取消动作

ACTION_OUTSIDE   移出边界动作

ACTION_POINTER_DOWN  第二个点的按下动作 用于多点触控的判断

ACTION_POINTER_UP  第二个点的提起动作

ACTION_MASK  动作掩码 获得多点触控信息

getEventTime 获取事件时间

getX 获取在控件内部的相对横坐标

getY 获取在控件内部的相对纵坐标

getRawX  获取在屏幕上的绝对横坐标

getRawY 获取在屏幕上的绝对纵坐标

getPressure 获取触摸的压力大小

getPointerCount  获取触控点的数量

单点触摸效果如下

点击后可以显示一系列点击信息 当然最好连接真机测试 效果更好

 

 代码如下

Java类

package com.example.event;

import android.annotation.SuppressLint;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.view.MotionEvent;
import android.widget.TextView;

@SuppressLint("DefaultLocale")
public class TouchSingleActivity extends AppCompatActivity {
    private TextView tv_touch; // 声明一个文本视图对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_touch_single);
        tv_touch = findViewById(R.id.tv_touch);
    }

    // 在发生触摸事件时触发
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 从开机到现在的毫秒数
        int seconds = (int) (event.getEventTime() / 1000);
        String desc = String.format("动作发生时间:开机距离现在%02d:%02d:%02d",
                seconds / 3600, seconds % 3600 / 60, seconds % 60);
        desc = String.format("%s\n动作名称是:", desc);
        int action = event.getAction(); // 获得触摸事件的动作类型
        if (action == MotionEvent.ACTION_DOWN) { // 按下手指
            desc = String.format("%s按下", desc);
        } else if (action == MotionEvent.ACTION_MOVE) { // 移动手指
            desc = String.format("%s移动", desc);
        } else if (action == MotionEvent.ACTION_UP) { // 松开手指
            desc = String.format("%s提起", desc);
        } else if (action == MotionEvent.ACTION_CANCEL) { // 取消手势
            desc = String.format("%s取消", desc);
        }
        desc = String.format("%s\n动作发生位置是:横坐标%f,纵坐标%f,压力为%f",
                desc, event.getX(), event.getY(), event.getPressure());
        tv_touch.setText(desc);
        return super.onTouchEvent(event);
    }

}

XML文件

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

    <TextView
        android:id="@+id/tv_touch"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这里显示单点触摸结果"
        android:textColor="@color/black"
        android:textSize="17sp" />
    
</LinearLayout>

二、多点触控

除了单点触摸 智能手机还普遍支持多点触控,即响应两个及以上手指同时按压屏幕,多点触控可用于操纵图像的缩放与旋转操作以及需要多点处理的游戏界面

效果如下 分为主要动作和次要动作

 代码如下

Java类

package com.example.event;

import android.annotation.SuppressLint;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.MotionEvent;
import android.widget.TextView;

@SuppressLint("DefaultLocale")
public class TouchMultipleActivity extends AppCompatActivity {
    private TextView tv_touch_major; // 声明一个文本视图对象
    private TextView tv_touch_minor; // 声明一个文本视图对象
    private boolean isMinorDown = false; // 次要点是否按下

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_touch_multiple);
        tv_touch_major = findViewById(R.id.tv_touch_major);
        tv_touch_minor = findViewById(R.id.tv_touch_minor);
    }

    // 在发生触摸事件时触发
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 从开机到现在的毫秒数
        int seconds = (int) (event.getEventTime() / 1000);
        String desc_major = String.format("主要动作发生时间:开机距离现在%02d:%02d:%02d\n%s",
                seconds / 3600, seconds % 3600 / 60, seconds % 60, "主要动作名称是:");
        String desc_minor = "";
        isMinorDown = (event.getPointerCount() >= 2);
        // 获得包括次要点在内的触摸行为
        int action = event.getAction() & MotionEvent.ACTION_MASK;
        if (action == MotionEvent.ACTION_DOWN) { // 按下手指
            desc_major = String.format("%s按下", desc_major);
        } else if (action == MotionEvent.ACTION_MOVE) { // 移动手指
            desc_major = String.format("%s移动", desc_major);
            if (isMinorDown) {
                desc_minor = String.format("%s次要动作名称是:移动", desc_minor);
            }
        } else if (action == MotionEvent.ACTION_UP) { // 松开手指
            desc_major = String.format("%s提起", desc_major);
        } else if (action == MotionEvent.ACTION_CANCEL) { // 取消手势
            desc_major = String.format("%s取消", desc_major);
        } else if (action == MotionEvent.ACTION_POINTER_DOWN) { // 次要点按下
            desc_minor = String.format("%s次要动作名称是:按下", desc_minor);
        } else if (action == MotionEvent.ACTION_POINTER_UP) { // 次要点松开
            desc_minor = String.format("%s次要动作名称是:提起", desc_minor);
        }
        desc_major = String.format("%s\n主要动作发生位置是:横坐标%f,纵坐标%f",
                desc_major, event.getX(), event.getY());
        tv_touch_major.setText(desc_major);
        if (isMinorDown || !TextUtils.isEmpty(desc_minor)) { // 存在次要点触摸
            desc_minor = String.format("%s\n次要动作发生位置是:横坐标%f,纵坐标%f",
                    desc_minor, event.getX(1), event.getY(1));
            tv_touch_minor.setText(desc_minor);
        }
        return super.onTouchEvent(event);
    }

}

XML文件

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

    <TextView
        android:id="@+id/tv_touch_major"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这里显示主要点触摸结果"
        android:textColor="@color/black"
        android:textSize="17sp" />
    
    <TextView
        android:id="@+id/tv_touch_minor"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这里显示次要点触摸结果"
        android:textColor="@color/black"
        android:textSize="17sp" />
    
</LinearLayout>

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

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

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

相关文章

Python3,5行代码,让你拥有无限量壁纸美图,终于告别手动下载了。

这里写目录标题1、引言2、代码实战2.1 手动下载2.2 代码批量下载3、总结1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 你电脑桌面壁纸挺好看啊。 小鱼&#xff1a;那是&#xff0c; 毕竟我的审美观在这摆着呢。 小屌丝&#xff1a;你这话&#xff0c;让我不服… 小鱼&#xff…

STC51单片机30——单个数码管显示

#include<reg51.h> // 包含51单片机寄存器定义的头文件 /************************************************** 函数功能&#xff1a;延时函数&#xff0c;延时一段时间 ***************************************************/ void delay(void) { unsigned …

腾讯二面vue面试题总结

Vue2.x 响应式数据原理 整体思路是数据劫持观察者模式 对象内部通过 defineReactive 方法&#xff0c;使用 Object.defineProperty 来劫持各个属性的 setter、getter&#xff08;只会劫持已经存在的属性&#xff09;&#xff0c;数组则是通过重写数组7个方法来实现。当页面使…

在 Swift 图表中使用 Foudation 库中的测量类型

前言 在这篇文章中&#xff0c;我们将建立一个条形图&#xff0c;比较基督城地区自然散步的持续时间。我们将使用今年推出的新的Swift Charts 框架&#xff0c;并将看到如何绘制默认不符合 Plottable 协议的类型的数据&#xff0c;如 Measurement<UnitDuration>。 定义…

【附源码】计算机毕业设计JAVA校园社团管理平台演示录像2021

【附源码】计算机毕业设计JAVA校园社团管理平台演示录像2021 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1…

537页15万字大数据治理体系、大数据可视化平台及应用方案

目录 第1章 前言 第2章 集团企业大数据现状分析 2.1、 基本现状 2.2、 总体现状 2.2.1、 行领导 2.2.2、 业务人员 2.3、 数据架构方面 2.3.1、 业务表现 2.3.2、 问题 2.4、 数据应用难题 2.4.1、 缺少统一的应用分析标准 2.4.1.1、 业务表现 2.4.1.2、 问题 2.4…

天天都在CRUD,你知道数据库如何工作的吗?

作为一个天天都在CRUD的程序员&#xff0c;你有没有想过&#xff0c;数据库是如何工作的&#xff1f; 今天&#xff0c;让我们从一个最最最简单的模型开始&#xff0c;揭开数据库神秘的一角。 对我们使用者而言&#xff0c;数据库就像是一个黑盒子&#xff0c;你可以往它里面…

神策 SCRM 正式发布,打通企业全域数据,聚焦私域精细化运营

随着企业微信能力的不断延展和客户接受度的持续提升&#xff0c;越来越多的企业开始基于企业微信生态搭建私域流量池&#xff0c;通过高粘性的专属服务和沟通提升客户满意度和转化效率。在企微私域运营过程中&#xff0c;他们发现&#xff1a; 管理难&#xff1a;客户分散在每位…

【Nginx】初识与环境准备

文章目录Nginx简介Nginx的优点及功能特性Nginx常用功能模块及组成Nginx系统环境准备Nginx安装方式介绍Nginx目录结构分析Nginx服务器启停命令方式一:Nginx服务的信号控制方式二:Nginx的命令行控制Nginx服务操作的问题Nginx配置成系统服务可能会出现的问题Nginx命令配置到系统环…

酷开科技 | 强势出圈,酷开系统一举突破媒介价值纵深

从起势到成熟&#xff0c;从无序到理性&#xff0c;从单一到多维&#xff0c;如今的OTT市场&#xff0c;早已是一个全新的舞台&#xff0c;不仅OTT的功能与服务承载更加丰富&#xff0c;产业的竞争维度也更加多元。踔厉奋发的OTT行业&#xff0c;在新的时代背景和产业环境下&am…

关于Python自动化的就业真相

作为近几年来特别受欢迎的编程语言之一&#xff0c;Python一直以来被众多行业内人士寄予厚望&#xff0c;今后有可能替代老牌霸主Java&#xff0c;成为新一代编程语言榜首。 为什么懂技术的人必学Python&#xff1f; 与其他语言相比&#xff0c;Python中的语言语法特别简单&a…

ABBYY FineReader PDF2023版本有什么新特点?

ABBYY FineReader PDF Windows版更加智能的 PDF 解决方案在数字化工作场所转换、编辑、共享和协作处理数字化工作场所中的 PDF 和扫描件。 在阅读某些扫描得到的PDF文档时&#xff0c;我经常因为它不可编辑而烦恼&#xff0c;直到我遇到了ABBYY。打开ABBYY FineReader PDF软件…

【MySQL进阶】深入理解B+树索引底层原理

【MySQL进阶】深入理解B树索引底层原理 文章目录【MySQL进阶】深入理解B树索引底层原理一、前言——没有索引的查找1、在一个页中的查找2、在很多页中查找3、总结二、索引1、一个简单的索引方案2、InnoDB中的索引方案3、B 树4、聚簇索引5、二级索引6、回表7、联合索引三、InnoD…

vivado跑完发邮件

前言 vivado 综合实现要跑好长时间&#xff0c;耍会儿手机不过分吧。然而我不想时不时抬头看有没有跑完&#xff0c;于是产生了该脚本 一. QQ邮箱配置 参考&#xff1a;https://blog.csdn.net/qq_40608730/article/details/104904398?spm1001.2014.3001.5502 &#xff08;注…

c++11特性(2)

目录 1.新增了两个默认成员函数 2.新增了几个关键字 3.可变参数模板 1.新增了两个默认成员函数 a.移动构造函数 b.移动赋值运算符重载 默认生成的前提条件&#xff1a;没有实现析构函数&#xff0c;拷贝构造&#xff0c;拷贝赋值重载中的任意一个。 为什么要实现移动的版…

三菱PLC单轴运动控制

1、什么是运动控制 ​ 运动控制&#xff0c;也可叫做电力拖动控制&#xff1b;它是自动化的一个分支&#xff0c;其动力源大部分都基于电动机。 也就是说&#xff0c;运动控制其实是基于电动机&#xff0c;实现物体对于角位移、速度、转矩等物理量改变的控制。 这里面&#xf…

Linux开发工具(2)——vim

文章目录多模式编辑器——vimvim的基本操作命令模式&#xff08;Normal mode&#xff09;插入模式&#xff08;Insert mode&#xff09;底行模式&#xff08;Last line mode&#xff09;vim的基本配置原理配置sudoers文件多模式编辑器——vim vim是一种多模式编辑器&#xff0c…

MYSQL语法一:创建表和查看表的所有列和所有数据库等

前言&#xff1a;接下里&#xff0c;我们即将开启mysql的旅行之路。首先是它的基础知识 1.mysql的基本知识点 mysql是客户端加服务器的模式。 客户端给服务器发送的数据称为请求request 服务器给客户端返回的数据称为响应response 客户端和服务器可以在不同主机上&#xff0c;…

轻松学习jQuery事件和动画

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;前端开发者…

计算机网络-网络层详细讲解(持续更新中)

网络层概述 网络层的主要任务是实现网络互连&#xff0c;进而实现数据包在各网络之间的传输。 要实现网络层主要任务&#xff0c;需要解决以下主要问题&#xff1a; 网络层向运输层提供怎样的服务&#xff08;“可靠传输”还是“不可靠传输‘&#xff09;网络层寻址问题路由…