【代码】Android|获取压力传感器、屏幕压感数据(大气压、原生和Processing)

首先需要分清自己需要的是大气压还是触摸压力,如果是大气压那么就是TYPE_PRESSURE,可以参考https://source.android.google.cn/docs/core/interaction/sensors/sensor-types?hl=zh-cn。如果是触摸压力就是另一回事,我需要的是触摸压力。

不过我整错了,一开始做成了大气压,后来又先做了原生的才发现Processing已经实现了,那么现在把两种代码都贴一下吧。

如果你和我一样都是用Processing-Android的,请你直接看最后一种方法,前面都别看了

文章目录

    • 压力传感器
    • 屏幕压感
      • 原生Android
      • Processing压感
        • GPT说重写压感事件函数
        • Github倾情推荐的touches数组

压力传感器

import android.app.Activity;
import android.os.Bundle;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;public class PressureSensorActivity extends Activity implements SensorEventListener {private SensorManager sensorManager;private Sensor pressureSensor;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);pressureSensor = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);}@Overrideprotected void onResume() {super.onResume();sensorManager.registerListener(this, pressureSensor, SensorManager.SENSOR_DELAY_NORMAL);}@Overrideprotected void onPause() {super.onPause();sensorManager.unregisterListener(this);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}@Overridepublic void onSensorChanged(SensorEvent event) {float pressure = event.values[0];// 使用压力值}
}

需要注意的是这些部分:

import android.app.Activity;
import android.os.Bundle;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;...private SensorManager sensorManager;private Sensor pressureSensor;
...sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);pressureSensor = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);}@Overrideprotected void onResume() {super.onResume();sensorManager.registerListener(this, pressureSensor, SensorManager.SENSOR_DELAY_NORMAL);}@Overrideprotected void onPause() {super.onPause();sensorManager.unregisterListener(this);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}@Overridepublic void onSensorChanged(SensorEvent event) {float pressure = event.values[0];// 使用压力值}

其他的按常规写就行了。

屏幕压感

这个需要分两种情况,一种情况是不带processing的时候写的,另一种是在processing-Android的基础上写的。我是需要结合processing的。但是我不幸的是我两种都写了。

原生Android

注:附带一点GPT的说明,不然我怕就贴个代码太枯燥了。

在安卓平台上,"压感"通常指的是触摸屏幕时的压力感应,这与气压传感器(通常用于测量环境气压)是不同的。如果你的平板支持触摸压力(也称为力度或压感级别),那么这通常是通过触摸事件而不是传感器事件来获取的。

要处理触摸事件中的压力,你需要覆盖 View 的 onTouchEvent(MotionEvent event) 方法。MotionEvent 对象包含与触摸相关的所有数据,包括压力。这里是如何实现它的一个基本例子:

@Override
public boolean onTouchEvent(MotionEvent event) {// 获取动作类型int action = event.getActionMasked();// 获取触摸事件的压力值float pressure = event.getPressure();// 根据触摸事件类型处理压力值switch (action) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:case MotionEvent.ACTION_UP:// 在这里处理压力值,例如打印出来Log.d("Pressure", "Current pressure: " + pressure);break;}return true; // 表示此事件已被处理
}

请注意,这段代码应该添加到你的视图或活动中,具体取决于你想要处理触摸事件的位置。onTouchEvent 方法在用户触摸屏幕时被调用,event.getPressure() 会返回当前触摸点的压力值,通常范围是从0(没有压力)到1(最大压力),但实际的最大值可能取决于具体设备。

另外,不是所有的设备都支持触摸压力,这取决于具体的硬件。如果你在上述代码中始终得到相同的压力值(例如,始终是1),那可能是你的设备不支持压力感应,或者支持的压力范围非常有限。在这种情况下,你可能需要检查设备规格,或者使用其他类型的输入来增强用户体验。

注:这代码俺也不知道怎么用,应该是贴在主活动Activity就能用了。

Processing压感

Processing-Android压感呢,有两种实现方式,一种是直接重写它的压感类,是能用的但是不是很好用,因为它会覆盖其他的事件,这让人糟心,因为其他的事件全部都会废掉;另一种是非常非常简单,正常人都不会想到。

GPT说重写压感事件函数

如果你在使用 Processing(看起来你的代码是基于 Processing 库或框架),处理 MotionEvent 的方式可能会有所不同。在 Processing 中,你通常会重写 mousePressed(), mouseDragged() 等方法来处理触摸事件,而不是直接处理 MotionEvent。

然而,如果你需要直接访问 MotionEvent 对象,你可以在 Processing 中重写 surfaceTouchEvent(MotionEvent event) 方法。这个方法在 Processing 环境中被调用,当有触摸事件发生时,传递给你一个 MotionEvent 对象。例如:

public void surfaceTouchEvent(MotionEvent event) {int action = event.getActionMasked();float x = event.getX();float y = event.getY();float pressure = event.getPressure();// 处理不同的触摸事件switch (action) {case MotionEvent.ACTION_DOWN:// 处理按下动作break;case MotionEvent.ACTION_MOVE:// 处理移动动作break;case MotionEvent.ACTION_UP:// 处理抬起动作break;// 可以添加更多的case来处理其他事件类型}
}

贴到Processing中间,然后拿平板的笔一写啊,真的能用!
在这里插入图片描述

帅。

但是随后我就发现我的其他和touch相关的事件全部失效了。

坏。

Github倾情推荐的touches数组

大佬的贡献:https://github.com/processing/processing-android/issues/226

如果不想看英文那么我简单翻译一下这个issue的意思:
大佬说:这个touch事件问题这么多,我给改了一下,暴露出来了touches数组,常用功能呢这里都有,用的时候直接调用就可以了。
大佬(谦虚.jpg):应该可以浅浅解决某某某、某某某、某某这三个issue。

所以就是这样,使用这个就行了。具体使用方式示例:

// get pressure 取第一个touches的压力值
for (int i = 0; i < touches.length; i++) {pressure = touches[i].pressure;break;
}

其中的touches不是未定义的变量,而是它自带的,就和width、height一样,能直接用。

就很简单,非常简单,让我感觉上面所有的努力都是sb。

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

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

相关文章

解决虚拟机启动报错:“End kernel panic - not syncing: attempted to kill the idle task”

原本能正常运行的虚拟机&#xff0c;很长一段时间没用后&#xff0c;今天再次启动&#xff0c;然后就出现下面的问题&#xff1a; 然后走了一些弯路&#xff0c;比如说删除该虚拟机然后新建一个虚拟机&#xff08;问题未解决&#xff09;、直接删除VitualBox重新安装&#xff0…

【前端寻宝之路】学习如何使用HTML实现简历展示和填写

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-iJ3Ou0qMGFVaqVQq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

UDP协议和TCP协议详解

文章目录 应用层自定义协议 传输层udp协议TCP协议1.确认应答2.超时重传3.连接管理建立连接, 三次握手断开连接, 四次挥手tcp的状态 4.滑动窗口5.流量控制6.拥塞控制7.延时应答8.携带应答9.面向字节流10.异常情况 应用层 自定义协议 客户端和服务器之间往往要进行交互的是“结构…

NoSQL--2.MongoDB配置

目录 2.MongdoDB配置 2.1 Windows环境下操作 2.1.1 注册MongDB Atlas&#xff1a; 2.1.2 MongoDB Community Server Download&#xff1a; 2.1.3 启动MondgoDB服务&#xff1a; 2.1.3.1 命令行参数的方式启动MongoDB服务&#xff1a; 2.1.3.2 使用配置文件方式启动Mongo…

自建Web视频会议,视频互动,SFU/MCU融合架构选型方案分析

网络越来越好&#xff0c;大家已经越来越多接受在家在线办公&#xff0c;在线工作越来越离不开视频会议&#xff0c;视频互动&#xff0c;当然云平台很多&#xff0c;但也用不同的需求&#xff0c;很多需要自建平台与自已的业务系统集成对接。因为大家业务系统多是b/s架构。一般…

软件实例,佳易王账单账本记账汇总统计管理系统软件教程

软件实例&#xff0c;佳易王账单账本记账汇总统计管理系统软件教程 一、前言 以下软件程序教程 以 佳易王账单记账汇总统计管理系统软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 账单可以记录 1、收入明细 2、支出明细 3、客户…

易语言源代码5000例

仅供学习研究交流使用 加群下载

js 面试运行机制和存储(从以下几方面理解),栈和堆的理解

1 工作原理 每个浏览器都有自己的引擎&#xff0c;通过引擎把代码解析运行起来。 2 生命周期 3-1 内存分配 3-2 内存使用 3-3 内存回收 3 栈和堆的理解 timer也是个函数--所以也是引用类型。 4 如何运行 以下可忽略 首先声明变量&#xff0c;放在左侧栈中执行&#xff0c;在执行…

java中的set

Set Set集合概述和特点 不可以存储重复元素 没有索引,不能使用普通for循环遍历 哈希值 哈希值简介 是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值 如何获取哈希值 Object类中的public int hashCode()&#xff1a;返回对象的哈希码值。 哈希值的特点 同一个…

【C++精简版回顾】18.文件操作

1.文件操作头文件 2.操作文件所用到的函数 1.文件io 1.头文件 #include<fstream> 2.打开文件 &#xff08;1&#xff09;函数名 文件对象.open &#xff08;2&#xff09;函数参数 /* ios::out 可读 ios::in 可…

EtlCloud安装部署及简单应用

背景 最近碰到了一个数据同步的业务场景&#xff0c;客户要求生产环境的某些特定数据定时同步到指定的数据池中&#xff0c;并对数据池中的表名称有特殊要求&#xff0c;必须以t_xxxx_tablename的格式命名&#xff0c;其中xxxx为单位编号&#xff0c;tablename可以是应用中的表…

java-幂等性

幂等性 1.1幂等性定义&#xff1a; 在计算机领域中&#xff0c;幂等&#xff08;Idempotence&#xff09;是指任意一个操作的多次执行总是能获得相同的结果&#xff0c;不会对系统状态产生额外影响。在Java后端开发中&#xff0c;幂等性的实现通常通过确保方法或服务调用的结…