首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 觸控壓力與時長獲取完整指南:API 詳解與版本相容性

     編輯:程式設計綜合問答

核心 API 介紹

Android 透過 MotionEvent 提供觸控壓力與時長資訊,主要方法如下:

方法回傳值說明API Level單位/範圍
getPressure()當前觸控壓力10.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) {
    // 支援壓力感測的指標裝置
}

版本相容性與限制

  • API 1+:基本壓力與時間 API 可用
  • API 14+:getButtonState()、手寫筆支援
  • API 23+: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);
    }
}

注意事項

  1. 壓力值受螢幕保護貼、濕手影響大
  2. 多點觸控時需使用 getPointerId() 追蹤特定手指
  3. 長按偵測建議使用 GestureDetector.OnLongPressListener
  4. 單位時間內事件頻率高,避免在 onTouch 中執行耗時操作

善用 MotionEvent 豐富 API,即可實現專業級觸控交互體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved