Nơi tốt nhất để làm sáng tỏ điều này là mã nguồn. Các tài liệu rất thiếu sót về việc giải thích điều này.
ClarkTouchEvent thực sự được định nghĩa trên Activity, View và Viewgroup. Hãy nghĩ về nó như một bộ điều khiển quyết định cách định tuyến các sự kiện chạm.
Ví dụ: trường hợp đơn giản nhất là View.dispatchTouchEvent sẽ định tuyến sự kiện chạm tới OnTouchListener.onTouch nếu được xác định hoặc theo phương thức mở rộng onTouchEvent .
Đối với Viewgroup.dispatchTouchEvent, mọi thứ phức tạp hơn nhiều. Nó cần phải tìm ra một trong những khung nhìn con của nó sẽ nhận được sự kiện (bằng cách gọi child.dispatchTouchEvent). Về cơ bản, đây là một thuật toán thử nghiệm thành công trong đó bạn tìm ra hình chữ nhật giới hạn của khung nhìn con nào chứa tọa độ điểm chạm.
Nhưng trước khi nó có thể gửi sự kiện đến chế độ xem con thích hợp, phụ huynh có thể theo dõi và / hoặc chặn tất cả sự kiện lại với nhau. Đây là những gì onInterceptTouchEvent dành cho. Vì vậy, nó gọi phương thức này trước khi thực hiện kiểm tra lần truy cập và nếu sự kiện bị tấn công (bằng cách trả về đúng từ onInterceptTouchEvent), nó sẽ gửi ACTION_CANCEL cho các chế độ xem con để chúng có thể từ bỏ xử lý sự kiện chạm của chúng (từ các sự kiện chạm trước đó) và từ đó trở đi tất cả các sự kiện chạm ở cấp độ cha được gửi đến onTouchListener.onTouch (nếu được xác định) hoặc onTouchEvent (). Cũng trong trường hợp đó, onInterceptTouchEvent không bao giờ được gọi lại.
Bạn thậm chí có muốn ghi đè [Hoạt động | Viewgroup | Xem] .dispatchTouchEvent không? Trừ khi bạn đang thực hiện một số định tuyến tùy chỉnh, bạn có thể không nên.
Các phương thức mở rộng chính là Viewgroup.onInterceptTouchEvent nếu bạn muốn theo dõi và / hoặc chặn sự kiện chạm ở cấp độ cha mẹ và View.onTouchListener / View.onTouchEvent để xử lý sự kiện chính.
Tất cả trong tất cả các thiết kế imo quá phức tạp của nó, nhưng apis android nghiêng về sự linh hoạt hơn là sự đơn giản.