Android 觸摸事件分發機制是面試高頻考點,也是複雜交互開發的基礎。本文系統梳理觸摸事件類型、View 通用監聽機制及實戰注意事項。
所有 View (包括 ViewGroup) 均繼承自 `View` 類,均擁有 `setOnTouchListener` 方法,均可監聽觸摸事件。
// 任意 View 均可設置
frameLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
// 處理按下
return true; // 返回 true 表示消費事件,繼續接收後續事件
case MotionEvent.ACTION_MOVE:
// 處理移動
break;
case MotionEvent.ACTION_UP:
// 處理抬起
break;
}
return false; // 未消費,傳遞給 onTouchEvent
}
});
int pointerCount = event.getPointerCount();
for (int i = 0; i < pointerCount; i++) {
int id = event.getPointerId(i);
float x = event.getX(i);
float y = event.getY(i);
// 處理每個觸控點
}
view.setOnTouchListener((v, event) -> {
if (event.getAction() == MotionEvent.ACTION_UP) {
// 處理觸摸邏輯
}
return false; // 必須返回 false,才能觸發 OnClickListener
});
view.setOnClickListener(v -> {
// 點擊邏輯正常執行
});
// 在 View 中重寫
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
// 擴大 50dp 觸摸區域
Rect rect = new Rect(-50, -50, getWidth()+50, getHeight()+50);
if (!rect.contains((int)event.getX(), (int)event.getY())) {
return false;
}
return super.dispatchTouchEvent(event);
}
掌握觸摸事件分發鏈路,是實現流暢交互、解決滑動衝突的關鍵。