首先需要分清自己需要的是大氣壓還是觸摸壓力,如果是大氣壓那么就是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。