問題:`View.OnTouchListener` 僅處理 `ACTION_DOWN` 回傳 `true`,與 `OnClickListener` 有何不同?
| 維度 | OnClickListener | OnTouchListener (僅 DOWN) |
|---|---|---|
| 觸發時機 | `ACTION_DOWN` → `ACTION_UP` 同一 View 內,**且未移動超過 slop** | 手指按下瞬間 (`ACTION_DOWN`),**無論後續是否移動/取消** |
| 回傳值 | 無 (void) | `true` = 消費事件,阻斷後續分發 (含 `onClick`);`false` = 繼續分發 |
| 長按/滑動 | 不觸發 click | 若回傳 `true`,**長按、滑動、取消都不會觸發 `onClick`** |
| 無障礙/鍵盤 | 支援 (Enter/Space 觸發) | **不支援** (TalkBack、鍵盤導航無法觸發) |
| 適用場景 | 標準點擊行為 | 自訂手勢、拖拽、長按選單、遊戲操控 |
// OnClickListener:標準點擊
btn.setOnClickListener(v -> doSomething());
// OnTouchListener 僅 DOWN 並消費
btn.setOnTouchListener((v, e) -> {
if (e.getAction() == MotionEvent.ACTION_DOWN) {
doSomething();
return true; // 消費,onClick 不會被調用
}
return false; // 其他事件繼續分發
});
結論:**只處理 `ACTION_DOWN` 並回傳 `true` 會阻斷 `onClick`、破壞無障礙、誤觸發長按/滑動**,除非在做自訂手勢,否則請老實用 `OnClickListener`。