Android : 使用GestureOverlayView进行手势识别—简单应用

示例图:

GestureOverlayView介绍:

GestureOverlayView 是 Android 开发中用于识别和显示手势的视图组件。它允许用户在屏幕上绘制手势,并且应用程序可以检测和响应这些手势。以下是关于 GestureOverlayView 的主要特点:

  1. 手势识别GestureOverlayView 可以识别并跟踪用户在屏幕上绘制的手势。这意味着用户可以在屏幕上自由绘制,而 GestureOverlayView 会捕捉并分析这些动作。
  2. 手势识别器:为了能够识别和处理手势,你需要一个 GestureDetector。这个识别器会分析 GestureOverlayView 捕获的手势数据,并将可识别的手势传递给应用程序。
  3. 手势显示GestureOverlayView 还可以在用户绘制手势时显示一个可视化的指示器,这有助于用户了解他们正在创建的手势。
  4. 自定义手势:你可以定义自己的手势,并使用 GestureDetector 识别它们。这意味着你可以创建特定于你的应用程序的手势,如自定义的绘画动作或特殊的命令手势。
  5. 触摸事件GestureOverlayView 还提供了一种机制,可以让你在用户与视图交互时获取触摸事件。这使得你可以在用户绘制手势时执行其他操作,例如更改视图或响应用户的输入。
  6. 集成与使用:要使用 GestureOverlayView,你需要在 XML 布局文件中将其添加到你的界面,并在 Java 或 Kotlin 代码中配置和初始化它。你还需要设置一个 GestureDetector 来处理识别到的手势。

总的来说,GestureOverlayView 是一个强大的工具,允许你在 Android 应用中实现手势识别功能。通过结合 GestureDetector 和自定义逻辑,你可以创建出高度交互和直观的用户界面。

使用 GestureOverlayView,你需要遵循以下步骤:

  1. 布局文件定义:在 XML 布局文件中添加 <android.gesture.GestureOverlayView> 标签。设置必要的属性,如 gestureColoruncertainGestureColor 和 gestureStrokeWidth
  2. 生成手势文件:使用 Gestures Builder(一个 SDK 中的示例项目)来生成手势文件。创建一个新的项目,然后运行它,将会生成手势文件。将这些文件导出并复制到你的项目中的 res/raw 目录下。
  3. 加载手势文件:在后台代码中,加载生成的手势文件。这通常涉及到读取 res/raw 目录下的文件。
  4. 识别和匹配手势:使用 GestureOverlayView 进行手势识别。这通常涉及到加载手势文件中的手势,并使用 GestureDetector 进行识别和匹配。
  5. 处理识别到的手势:当识别到手势时,你可以执行相应的操作。例如,你可以在用户绘制特定手势时触发特定的功能或操作。
  6. 集成与使用:在 Java 或 Kotlin 代码中,初始化 GestureOverlayView 并设置一个 GestureDetector 来处理识别到的手势。确保正确处理触摸事件和视图更新。
  7. 自定义手势:如果你需要自定义的手势,你可以定义它们并通过 GestureDetector 进行识别。这可能涉及到创建自定义的手势文件和编写相应的逻辑来处理这些手势。

请注意,使用 GestureOverlayView 需要一定的 Android 开发经验,特别是对于触摸事件和视图组件的处理。确保熟悉 Android 开发文档和相关的 API 指南,以便更好地利用这个功能强大的组件。

APi:GestureOverlayView  |  Android Developers (google.cn)

生成手势文件: google Play 商店下载app 搜索: Gestures Builder   

下载后 添加手势:

找到手势文件粘贴到项目内:

目录:        Android/data/migueldp.runeforge/files/gestures.txt

创建文件目录 raw:         res  ->  new -> Directory  -> raw           把文件放在该目录下

布局文件:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><!--当手势已经被识别出来时,是否拦截该手势动作android:eventsInterceptionEnabled="true"当用户画完 手势效果 淡出的时间android:fadeDuration="1000"当用户画完之后 手势是否自动淡出android:fadeEnabled="true"手势画笔颜色android:gestureColor="#fff00f"手势画笔样式android:gestureStrokeType="single"手势画笔粗细android:gestureStrokeWidth="20"--><!-- 1. 布局文件定义 --><android.gesture.GestureOverlayViewandroid:id="@+id/gestureOverlayView"android:layout_width="wrap_content"android:layout_height="match_parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"><TextViewandroid:id="@+id/textView"android:layout_width="300dp"android:layout_height="500dp"android:background="#FF5722"android:gravity="center"android:textSize="24sp"android:text="TextView"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></android.gesture.GestureOverlayView></androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

package com.example.mygestureoverlayviewdemo;import android.annotation.SuppressLint;
import android.gesture.Gesture;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;
import android.gesture.GestureOverlayView;
import android.gesture.Prediction;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {private TextView textView;private GestureOverlayView mGestureOverlayView;@SuppressLint("ClickableViewAccessibility")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.textView);mGestureOverlayView = findViewById(R.id.gestureOverlayView);//2.加载手势文件      找到文件 创建raw目录 把手势文件放在该目录下GestureLibrary mGestureLibrary= GestureLibraries.fromRawResource(this,R.raw.gestures);mGestureLibrary.load();/*** GestureOverlayView 事件监听器* interface	GestureOverlayView.OnGestureListener 手势监听器* interface	GestureOverlayView.OnGesturePerformedListener   手势执行监听器* interface	GestureOverlayView.OnGesturingListener  手势执行中监听器**/mGestureOverlayView.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {@Overridepublic void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {//3.识别和匹配手势ArrayList<Prediction> predictionArrayList = mGestureLibrary.recognize(gesture);Prediction prediction = predictionArrayList.get(0);//校验 相似度 越小越模糊 匹配度越高if(prediction.score >= 3.0){//4.处理识别到的手势 根据名字匹配if(prediction.name.equals("exit"))  finish(); //退出程序if (prediction.name.equals("下一个")) textView.setText("下一个,模拟操作下一个");if (prediction.name.equals("星星")) textView.setText("星星,kwwl");if (prediction.name.equals("roundSave")){textView.setText("画了一个圈,模拟操作保存");Toast.makeText(MainActivity.this,"圈圈保存",Toast.LENGTH_SHORT).show();}}else {Toast.makeText(MainActivity.this,"没有匹配到手势!",Toast.LENGTH_SHORT).show();}}});}}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Large-Precision Sign using PBS

参考文献&#xff1a; [CLOT21] Chillotti I, Ligier D, Orfila J B, et al. Improved programmable bootstrapping with larger precision and efficient arithmetic circuits for TFHE[C]//Advances in Cryptology–ASIACRYPT 2021: 27th International Conference on the T…

使用云渲染节省成本与提升渲染速度的秘诀

我们在提交效果图到云渲染平台时&#xff0c;有时会因为各种原因&#xff0c;如不小心设置错了参数&#xff0c;导致渲染时间变长&#xff0c;渲染费用增加。这不仅增加了项目的成本&#xff0c;还可能影响到整个项目的进度。面对这一问题&#xff0c;炫云提供了小光子、保守优…

Linux第一个小程序-进度条(c语言版)

目录 行缓冲区概念&#xff1a; 行缓冲区代码演示&#xff1a; ​编辑进度条代码 1&#xff1a;memset函数&#xff1a; 2&#xff1a;const char* lable"|/-\\"; 3&#xff1a;usleep C语言 usleep 函数的功能和用法&#xff1a; 4&#xff1a;进度条代码的实…

vue3 组件之间传值

vue3 组件之间传值 非常好&#xff0c;为啥突然开这样一篇博文&#xff0c;首先是因为 vue3 是未来发展的趋势。其次&#xff0c;vue 官方已经确认&#xff0c;将于2023年最后一天停止对 vue2 项目的维护&#xff0c;这个是官方发出的通知&#xff0c;并且呢&#xff0c;尤雨溪…

基于Java网上点餐系统设计与实现

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

静物摄影在UE5里运用几点记要

被摄体&#xff0c;相机与光源的关系&#xff0c;要增强立体感&#xff0c;摄像机与光源的位置关系要错开&#xff1b;b的立体感要更强 漫反射与点光源&#xff0c;UE5太阳光属于漫反射&#xff0c;整体比较柔和&#xff0c;但是阴影处比较黑&#xff1b;摄影棚会用反光板来增亮…

vscode 支持c,c++编译调试方法

概述&#xff1a;tasks.jason launch.json settings.json一定要有&#xff0c;没有就别想跑。还有就是c 和c配置有区别&#xff0c;切记&#xff0c;下文有说 1.安装扩展插件。 2.安装编译器&#xff0c;gcc.我用的是x86_64-8.1.0-release-win32-seh-rt_v6-rev0.7z &#xf…

【SpringCloud】-OpenFeign实战及源码解析、与Ribbon结合

一、背景介绍 二、正文 OpenFeign是什么&#xff1f; OpenFeign&#xff08;简称Feign&#xff09;是一个声明式的Web服务客户端&#xff0c;用于简化服务之间的HTTP通信。与Nacos和Ribbon等组件协同&#xff0c;以支持在微服务体系结构中方便地进行服务间的通信&#xff1b…

STM32CubeMX教程8 TIM 通用定时器 - 输出比较

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化函数调用流程 3.2.2、外设中断函数调用流程 3.2.3、添加其他必要代码 4、常用函数 5…

ssm基于JavaEE的智能实时疫情监管服务平台的设计与实现+jsp论文

摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本次开发一套智能实时疫情监管服务平台有管…

vue 项目/备案网页/ip网页打包成 apk 安装到平板/手机(含vue项目跨域代理打包成apk后无法访问接口的解决方案)

下载安装HBuilder X编辑器 https://www.dcloud.io/hbuilderx.html 新建 5APP 项目 打开 HBuilder X&#xff0c;新建项目 此处项目名以 ‘test’ 为例 含跨域代理的vue项目改造 若 vue 项目中含跨域代理&#xff0c;如 vue.config.js module.exports {publicPath: "./&…

《分布式事务理论基础:CAP定理 BASE理论》

目录 学习目标 1.分布式事务理论基础 1.1.本地事务 1.2.分布式事务 分布式事务产生的原因&#xff1f; 哪些场景会产生分布式事务&#xff1f; 单体系统会产生分布式事务问题吗&#xff1f; 只有一个库&#xff0c;会产生分布式事务问题吗&#xff1f; 分布式事务举…

跨进程通信 macOS XPC 创建实例

一&#xff1a;简介 XPC 是 macOS 里苹果官方比较推荐和安全的的进程间通信机制。 集成流程简单&#xff0c;但是比较绕。 主要需要集成 XPC Server 这个模块&#xff0c;这个模块最终会被 apple 的根进程 launchd 管理和以独立进程的方法唤起和关闭&#xff0c; 我们主app 进…

DotNet 命令行开发

DotNet 命令行开发 下载安装下载 SDK安装 SDK绿色版下载绿化脚本 常用命令创建 dotnet new运行 dotnet run发布应用 dotnet publish更多命令 VSCode 调试所需插件调试 CS 配置项目.csproj排除依赖关系 launch.jsontasks.json 参考资料 下载安装 下载 SDK 我们就下最新的好&am…

draw.io学习笔记

1、链接 1.1、自动连接图形 鼠标放在图形上&#xff0c;点击出现的箭头&#xff0c;会自动出常用图形 1.2、固定连接 如果拖动其中一个图形的话&#xff0c;固定链接的形状会是曲线连过去。 方法&#xff1a;不要点击左边图形鼠标放在边框上面左边出现绿圆点鼠标左键点击图形的…

LTPI协议的理解——2、LTPI实现的底层架构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 LTPI协议的理解——2、LTPI实现的底层架构 前言一、体系结构三、实现细节四、物理接口信号传输方法总结 前言 前面讲了LTPI的定义和大概结构&#xff0c;接下来继续理解LTPI…

【Linux系统编程二十五】:线程概念(Linux中的轻量级进程)

【Linux系统编程二十五】&#xff1a;线程概念(Linux中的轻量级进程&#xff09; 一.线程的概念1.地址空间是资源窗口 二.线程初步理解1.进程执行分支(内部运行)2.执行粒度更细3.重构进程概念&#xff1a;系统资源分配的基本实体4.重构线程概念&#xff1a;系统调度的基本单位5…

Kubernetes 学习总结(43)—— Kubernetes 从提交 deployment 到 pod 运行的全过程

当用户向 Kubernetes 提交了一个创建 deployment 的请求后&#xff0c;Kubernetes 从接收请求直至创建对应的 pod 运行这整个过程中都发生了什么呢&#xff1f; kubernetes 架构简述 在搞清楚从 deployment 提交到 pod 运行整个过程之前&#xff0c;我们有先来看看 Kubernete…

4. 云原生之kubesphere基础服务搭建

文章目录 安装kubesphere插件服务暴露NodePort方式LoadBalancer方式安装 OpenELB部署eip资源配置网关启动网关创建路由测试网关路由ingress高级功能在服务中配置LoadBalancer 基础设施部署服务部署建议helm仓库添加helm仓库 运维相关部署gitlab部署nexus3部署harbor 研发相关 安…

【c语言】飞机大战(1)

提前准备好游戏要的素材&#xff0c;可以到爱给网去找&#xff0c;飞机大战我们需要的是一个我方战机图片&#xff0c;一个背景图&#xff0c;三个敌方战机的图&#xff0c;我方战机的图片&#xff0c;敌方战机的图片&#xff0c;并且将图片和.cpp放在同一文件夹下. 这里创建.…