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

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

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

压力传感器

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; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
pressureSensor = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
} @Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(this, pressureSensor, SensorManager.SENSOR_DELAY_NORMAL);
} @Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
} @Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
} @Override
public 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);
} @Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(this, pressureSensor, SensorManager.SENSOR_DELAY_NORMAL);
} @Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
} @Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
} @Override
public 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。

【代码】Android|获取压力传感器、屏幕压感数据(大气压、原生和Processing)的更多相关文章

  1. android获取设备屏幕大小的方法

    // 通过WindowManager获取 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay( ...

  2. Android获取 应用程序大小,数据大小,缓存大小

    在项目中创建,android.content.pm 包名.里面创建两个aidl文件.PackageStats.aidl  和 IPackageStatsObserver.aidl. PackageSt ...

  3. android 获取当前屏幕作为毛玻璃模糊背景Acitivity作为弹出框。

    使用: 1.在执行弹出界面前,先将其当前屏幕截图. BlurBuilder.snapShotWithoutStatusBar(getActivity()); 2.为了确保界面切入无效果. startA ...

  4. Android获取手机屏幕宽高

    //如果是获取单位是像素,可以如下: Display display = getWindowManager().getDefaultDisplay(); Point size = new Point( ...

  5. android获取手机屏幕分辨率

    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceSt ...

  6. Android获取设备屏幕宽高像素值的两个方法

    private void get1() { Resources resources = this.getResources(); DisplayMetrics dm = resources.getDi ...

  7. Android中获取网页表单中的数据实现思路及代码

    在Android中获取网页里表单中的数据具体实现代码如下,感兴趣的各位可以参考过下哈,希望对大家有所帮助 MainActivity如下: 复制代码 代码如下: package cn.testjavas ...

  8. Android获取屏幕的大小与密度的代码

    Android项目开发中很多时候需要获取手机屏幕的宽高以及屏幕密度来进行动态布局,这里总结了三种获取屏幕大小和屏幕密度的方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  9. 【WPF】获取电磁笔的压感

    WPF 不仅支持触控,也支持笔的输入,比如现在比较高大上的电磁笔.便宜的板子一般不配备电磁笔,而是配电容笔,虽然也号称XXX级压感,但是效果自然不可与电磁笔相比. UIElement 类规范了UI元素 ...

  10. Android 获取屏幕尺寸与密度

      android中获取屏幕的长于宽,参考了网上有很多代码,但结果与实际不符,如我的手机是i9000,屏幕大小是480*800px,得到的结果却为320*533 结果很不靠谱,于是自己写了几行代码,亲 ...

随机推荐

  1. 使用guava的cache实现缓存

    一.maven <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  2. Java SPI机制及实现

    一.简介 SPI 的全称为 (Service Provider Interface),是 JDK 内置的一种服务提供发现机制.主要由工具类 java.util.ServiceLoader 提供相应的支 ...

  3. python 爬取博客访问量

    一.代码 """ Version: Python3.5 Author: OniOn Site: http://www.cnblogs.com/TM0831/ Time: ...

  4. Deepseek学习随笔(10)--- 本地AI神器Cherry Studio & Chatbox 保姆级教程(附网盘链接)

    本篇介绍的 Cherry Studio 和 Chatbox 两款工具,只需简单几步,即可实现本地化部署AI能力,支持对话.编程.绘图等多场景应用.本文将手把手教你从零开始配置使用! 一.软件下载:两步 ...

  5. Markdown 语法深度详解与实战演示

    一.引言 在当今数字化的时代,高效地处理和呈现文本信息变得至关重要.Markdown 作为一种轻量级标记语言,因其简洁.易读.易写的特点,受到了广大开发者.写作者和内容创作者的喜爱.无论您是撰写博客. ...

  6. 重生之数据结构与算法----数组&链表

    简介 数据结构的本质,只有两种结构,数组与链表.其它的都是它的衍生与组合 算法的本质就是穷举. 数组 数组可以分为两大类,静态数组与动态数组. 静态数组的本质是一段连续的内存,因为是连续的,所以我们可 ...

  7. day4-进制与位运算

    进制 对于整数有4种表现方式 二进制,满二进一 十进制,满10进1 八进制,满8进1,数字0开头 十六进制,满16进1,以0x或0X开头 进制转换 二进制转十进制 规则:从最低位开始(右边),将每位数 ...

  8. 程序员必看 Linux 常用命令(重要)

    文件操作命令 find find 用于在指定目录下查找文件或子目录,如果不指定查找目录,则在当前目录下查找 命令格式:find path -option [-print] [ -exec/-ok co ...

  9. Shell脚本实现服务器多台免密

    简介 本脚本(auto_ssh_batch.sh)用于在多台主机之间快速配置SSH免密登录,并支持远程传输脚本/文件及执行命令.通过 pass 文件提供统一认证凭据,通过 nodes 文件定义目标主机 ...

  10. Netty源码—6.ByteBuf原理一

    大纲 1.关于ByteBuf的问题整理 2.ByteBuf结构以及重要API 3.ByteBuf的分类 4.ByteBuf分类的补充说明 5.ByteBuf的主要内容分三大方面 6.内存分配器Byte ...