【代码】Android|获取压力传感器、屏幕压感数据(大气压、原生和Processing)
首先需要分清自己需要的是大气压还是触摸压力,如果是大气压那么就是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。