Android App事件交互中区分点击和长按动作以及识别手势滑动方向的讲解及实战(附源码 可直接使用)

news2025/7/28 3:12:43

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

一、区分点击和长按动作

区分点击和长按动作,只要看按压时长是否超过500毫秒即可,没超过的表示点击动作,超过了的表示长按动作。其实除了按压时长之外,按压力度也是一个重要的参考指标,通常,点击时按得比较轻,长按时按得相对比较重,依据按压时长与按压力度两项指标就可以有效得辨别点击和长按动作。

接下来实战演示,以按压点为圆心绘制源泉,观察点击和长按之时圆圈大小和信息不同

由下图可见不同得点击事件给出得信息是不同的,至于力度问题因为模拟机的问题不够精确,建议连接真机测试

 

 

代码如下

Java类 

package com.example.event;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

import com.example.event.widget.ClickView;

public class ClickLongActivity extends AppCompatActivity {
    private TextView tv_desc; // 声明一个文本视图对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_click_long);
        tv_desc = findViewById(R.id.tv_desc);
        ClickView cv_gesture = findViewById(R.id.cv_gesture);
        // 设置点击视图的手势抬起监听器
        cv_gesture.setLiftListener((time_interval, pressure) -> {
            String gesture = time_interval>500 ? "长按" : "点击";
            String desc = String.format("本次按压时长为%d毫秒,属于%s动作。\n按压的压力峰值为%f",
                    time_interval, gesture, pressure);
            tv_desc.setText(desc);
        });
    }
}

XML文件

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

    <TextView
        android:id="@+id/tv_desc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:text="请在空白区域按压片刻(短时与长时),再观察按压结果"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <com.example.event.widget.ClickView
        android:id="@+id/cv_gesture"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:background="@color/white" />

</LinearLayout>

二、识别手势滑动的方向

除了点击和长按外,分辨手势的滑动方向也很重要,手势往左或往右代表着左右翻页,网上或者往下代表着上下滚动,另外,手势向下还可能下拉刷新,手势向上还可能表示上拉加载。

直观的看,手势在水平方向掠过,意味着左右滑动,手势在垂直方向掠过,意味着上下滚动,左右滑动的画,手势触摸的起点和终点在水平方向的位移必定大于垂直方向的唯一,反之亦然 可分为以下三个步骤

1:对于按下手指事件 把当前点标记为起点 并记录起点的横纵坐标

2:对于松开手指事件  把当前点标记为终点,并记录终点的横纵坐标

3:分别计算起点与终点的横坐标距离与纵坐标距离,根据横纵坐标的大小关系判断本次手势的滑动方向

效果如下

 

 

 

代码如下

Java类 

package com.example.event;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

import com.example.event.util.DateUtil;
import com.example.event.widget.SingleTouchView;

public class SlideDirectionActivity extends AppCompatActivity {
    private TextView tv_desc; // 声明一个文本视图对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_slide_direction);
        tv_desc = findViewById(R.id.tv_desc);
        SingleTouchView stv_gesture = findViewById(R.id.stv_gesture);
        // 设置单点触摸视图的手势飞掠监听器
        stv_gesture.setFlipListener((beginPos, endPos) -> {
            float offsetX = Math.abs(endPos.x - beginPos.x);
            float offsetY = Math.abs(endPos.y - beginPos.y);
            String gesture = "";
            if (offsetX > offsetY) { // 水平方向滑动
                gesture = (endPos.x - beginPos.x > 0) ? "向右" : "向左";
            } else if (offsetX < offsetY) { // 垂直方向滑动
                gesture = (endPos.y - beginPos.y > 0) ? "向下" : "向上";
            } else { // 对角线滑动
                gesture = "对角线";
            }
            String desc = String.format("%s 本次手势为%s滑动", DateUtil.getNowTime(), gesture);
            tv_desc.setText(desc);
        });
    }
}

XML文件

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

    <TextView
        android:id="@+id/tv_desc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:text="请向上下左右四个方向滑动,再观察滑动结果"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <com.example.event.widget.SingleTouchView
        android:id="@+id/stv_gesture"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:background="@color/white" />

</LinearLayout>

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

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

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

相关文章

Isaac-gym(5):关于强化学习

官方链接&#xff1a; https://github.com/NVIDIA-Omniverse/IsaacGymEnvs 1、环境建立示例 import isaacgym import isaacgymenvs import torchenvs isaacgymenvs.make(seed0, task"Ant", #对应执行时用到的名称num_envs2000, sim_device"cuda:0"…

智芯传感-工业雷管禁售在即,电子雷管的大发展已然到来!

在我国重点支持发展的基础设施建设领域中&#xff0c;民爆行业是一个相对小众、但是非常重要的行业。在“十四五”规划中&#xff0c;国家大力推进电子雷管替代工业雷管&#xff0c;持续加强激励与引导&#xff0c;推进生产工艺及装备向安全可靠、绿色环保、智能制造方向发展&a…

Makefile 基础(二)—— Makefile 自动推导+ Makefile伪目标

目录 1、Makefile 自动推导&#xff08;隐含规则&#xff09; (1) 依赖项都在当前目录下 (2) 一部分依赖项不在当前目录下 2、Makefile 伪目标 1、Makefile 自动推导&#xff08;隐含规则&#xff09; 所谓隐含规则指的是&#xff0c;我们在Makefile文件中不使用 gcc/g 命…

openTCS 5.2 学习记录一(避坑)

openTCS5.2 学习记录一 初学者记录 一、学习背景 最近领导安排学习AGV相关调度方面的东西&#xff0c;我司使用的是openTCS来做AGV调度管理。本文主要记录最简单的启动&#xff0c;并且记录使用过程中的各个坑。 二、参考资料 openTCS官网 https://www.opentcs.org/en/ind…

玩机搞机-----安卓全机型刷机卡fastboot模式解决方法与故障解析

今天给友友们讨论下手机刷机后进不去系统卡fastboot模式一些问题解决方法和造成的原因故障解析。一般这类操作是由于以下几种原因导致的。包括但不限于以下其中之一 这种故障排除硬件原因除外哦 1-----刷第三方系统导致的重启卡fastboot模式 2-----降级更新官方固件跨版本幅…

Level1行情和l2行情数据api接口在逐笔成交记录上有什么区别?

除了买卖盘口显示的行情数据不同&#xff0c;Level-1行情和l2行情数据api接口第二个主要的区别是Level-1行情只有分时成交记录而l2行情数据api接口同时还提供逐笔成交记录。 也就是说Level-1行情是不提供具体的每笔交易明细的。但是l2行情数据api接口它记录了实时交易中每一笔…

第二章:Spring核心思想和IOC和AOP依赖注入

Spring 中IOC 如何理解&#xff1f; 中文控制反转&#xff0c;如何控制反转&#xff1f; 是一种思想&#xff0c;交给Spring容器来管理的一种思想&#xff0c;具体扫描注解&#xff0c;实现注入容器内。 平时使用某个类调用某个类的内的方法&#xff0c;需要先创建类的对象&a…

E 排队(排列组合)[牛客小*白月赛61]

题面如下&#xff1a; 思路 or 题解&#xff1a; 对于一个长度为 nnn 的 排列组合 如果存在一对 逆序对 (x,y)(x, y)(x,y) xxx 在 yyy 的前面有 n∗(n−1)2\frac{n * (n - 1)}{2}2n∗(n−1)​ 种情况 剩下 n−2n - 2n−2 个位置可以随意填数进去&#xff0c;不会影响到逆序对 …

Windows OpenGL ES 图像单色

目录 一.OpenGL ES 图像单色 1.原始图片2.效果演示 二.OpenGL ES 图像单色源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL E…

(STM32)从零开始的RT-Thread之旅--SPI驱动ST7735(2)

上一篇&#xff1a; (STM32)从零开始的RT-Thread之旅--PWM驱动ST7735调光 本篇使用的驱动来自ST官方提供&#xff1a; https://github.com/STMicroelectronics/stm32-st7735.git 需要的可以直接git clone下来移植&#xff0c;核心代码无关芯片型号&#xff0c;可移植性很不…

销量上不去?跨境电商出现这5种迹象,你需要Starday了!

随着2015年"互联网"时代的来临&#xff0c;跨境电商行业逐步走进了资本市场的视野中&#xff0c;跨境电商成为了有望对抗出口增速下台阶的利器。近年来&#xff0c;随着国际贸易条件的恶化&#xff0c;以及欧洲、日本的需求持续疲弱&#xff0c;中国出口贸易增速出现…

[附源码]Python计算机毕业设计jspm郫县兼职信息系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Egg实现用户注册登录以及使用jwt进行token鉴权

目录 什么是用户鉴权 注册接口 登录接口 jwt解密token 在一个后台服务中&#xff0c;用户鉴权是一个重点&#xff0c;几乎所有的需求都是围绕用户&#xff08;token&#xff09;去进行设计的&#xff0c;所以在用户鉴权也是我们必须要重视的课程&#xff0c;本章我们就利用…

【踩坑日记 · 前端】为 Excalidraw 添加中文手写字体

前言 Excalidraw 是一款完全免费的手绘风格绘图在线应用&#xff0c;能快速画出漂亮的流程图、示意图和图表&#xff0c;地址&#xff1a; Excalidraw | Hand-drawn look & feel • Collaborative • Secure 但美中不足的是&#xff0c;Excalidraw 只支持英文手写字体&…

[附源码]Python计算机毕业设计爱行无忧旅游票务管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

一文搞定,JMeter的三种参数化方式

1、Test Plan 中添加变量 可以在 Test Plan 中设置好添加变量&#xff0c;变量名可以在任意的位置使用&#xff0c;比如说在线程组中直接用${ 变量名 }方式引用&#xff0c;步骤如下&#xff1a; 1&#xff09;设置变量名和变量值 2&#xff09;添加线程组 3&#xff09;添…

记一场vue面试

Vue 修饰符有哪些 事件修饰符 .stop 阻止事件继续传播.prevent 阻止标签默认行为.capture 使用事件捕获模式,即元素自身触发的事件先在此处处理&#xff0c;然后才交由内部元素进行处理.self 只当在 event.target 是当前元素自身时触发处理函数.once 事件将只会触发一次.pass…

AcWing 数据结构

单链表 邻接表用的多 存储树和图 new()速度慢 数组模拟 模板 -1代表头节点 const int N 1e6 5; // head存储链表头 //e[]存储节点的值 //ne[]存储节点的next指针 //idx表示当前用到了哪个节点 int head, e[N], ne[N], idx;// 初始化 void init() {head -1;idx 0; }// 将…

皕杰报表之控件元素

在皕杰报表中&#xff0c;填报操作时&#xff0c;控件类型分为无输入控件、文本框、文本域、下拉框、下拉树、单选框、复选框、日期、时间、日期时间、自定义控件类型。如图所示&#xff1a; 1 无输入控件 选中此控件的单元格在页面生成无任何变化&#xff1b; 2 文本框 选中…

加拿大海运专线怎么选?加拿大海运专线有哪些费用

由于全球经济的发展&#xff0c;近年来&#xff0c;越来越多的国内跨境电商卖家向加拿大和、墨西哥、欧洲、美国等出口货物&#xff0c;而海运的运输方式相对比较划算。那么加拿大海运专线怎么选?又有哪些费用呢?一、加拿大海运专线怎么选 加拿大海运专线运输方式有整柜运输和…