Android 透過 MotionEvent 提供觸控壓力與時長資訊,主要方法如下:
| 方法 | 回傳值說明 | API Level | 單位/範圍 |
|---|---|---|---|
getPressure() | 當前觸控壓力 | 1 | 0.0 (無壓力) ~ 1.0 (最大壓力),無單位,為歸一化值 |
getPressure(int pointerIndex) | 指定手指的壓力 | 1 | 同上,支援多點觸控 |
getEventTime() | 事件發生時間 | 1 | 毫秒,自系統開機起 |
getDownTime() | 按下動作時間 | 1 | 毫秒,自系統開機起 |
getHistoricalPressure() | 歷史壓力值 | 1 | 批次事件中的歷史壓力 |
getAxisValue(MotionEvent.AXIS_PRESSURE) | 通用軸值獲取 | 12 | 同 getPressure() |
view.setOnTouchListener(new View.OnTouchListener() {
private long downTime = 0;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
downTime = SystemClock.uptimeMillis(); // 或 event.getDownTime()
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
long duration = SystemClock.uptimeMillis() - downTime;
float pressure = event.getPressure(); // 取得抬起瞬間壓力
Log.d("Touch", "時長: " + duration + "ms, 壓力: " + pressure);
break;
}
return true;
}
});
// 檢查裝置是否支援壓力感測
bool hasPressure = getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT);
// 或檢查輸入裝置來源
InputDevice device = event.getDevice();
if (device != null && (device.getSources() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
// 支援壓力感測的指標裝置
}
getButtonState()、手寫筆支援CLASSIFY_AMBIGUOUS_GESTURE 手勢分類FEATURE_STYLUS,壓力精度較高(4096 階以上)@Override
protected void onDraw(Canvas canvas) {
for (TouchPoint point : points) {
float pressure = point.pressure;
paint.setStrokeWidth(2 + pressure * 20); // 壓力控制筆觸寬度
paint.setAlpha((int)(pressure * 255)); // 壓力控制透明度
canvas.drawPoint(point.x, point.y, paint);
}
}
getPointerId() 追蹤特定手指GestureDetector.OnLongPressListener善用 MotionEvent 豐富 API,即可實現專業級觸控交互體驗。