需檢測按鈕的按下(ACTION_DOWN)與釋放(ACTION_UP)事件,按下時啟動計時器,釋放時停止,區別於普通點擊與長按事件。
button.setOnTouchListener((v, event) -> {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 手指按下:啟動計時器
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.start();
return true; // 消費事件,繼續接收後續事件
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
// 手指釋放或取消:停止計時器
chronometer.stop();
return true;
}
return false;
});
| 事件類型 | 觸發時機 | 適用場景 |
|---|---|---|
| OnClickListener | 按下並釋放完成 | 普通點擊操作 |
| OnLongClickListener | 長按達到閾值(默認 500ms) | 長按菜單、進入編輯模式 |
| OnTouchListener | 按下、移動、釋放、取消全過程 | 精確控制、拖拽、按住說話、計時器 |
recordButton.setOnTouchListener((v, event) -> {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startRecording();
v.setPressed(true); // 視覺反饋
return true;
case MotionEvent.ACTION_UP:
stopRecording();
v.setPressed(false);
return true;
case MotionEvent.ACTION_CANCEL:
cancelRecording();
v.setPressed(false);
return true;
}
return false;
});
true 表示消費事件,false 會中斷後續事件傳遞ACTION_CANCEL(如來電、彈窗打斷)OnTouchListener 提供精細的觸摸事件控制,是實現按住計時、錄音、拖拽等交互的基礎。