Tôi không hỏi làm thế nào để xử lý các sự kiện liên lạc, nhưng những gì đang xảy ra đằng sau hậu trường? Nếu có một số tiện ích con lồng nhau, thứ tự nào họ thấy các sự kiện trong đó? Nhà phát triển có bất kỳ quyền kiểm soát nào không? Lý tưởng nhất là tôi muốn một tài liệu về chủ đề này.Sự kiện chạm trên Android được phân phối như thế nào?
Trả lời
Từ quan điểm hoạt động:
Sự kiện cảm ứng được gửi trước đến Activity.dispatchTouchEvent. Đó là nơi bạn có thể bắt chúng trước. Ở đây họ được gửi đến Window, nơi họ đi qua hệ thống phân cấp Xem, theo thứ tự mà các Widget được vẽ cuối cùng (trên đầu các tiện ích khác) có cơ hội xử lý liên lạc trong View.onTouchEvent trước tiên. Nếu một số Chế độ xem trả về true trong onTouchEvent, thì dừng truyền tải và các Chế độ xem khác sẽ không nhận được sự kiện chạm.
Cuối cùng, nếu không Chế độ xem nào tiêu thụ liên lạc, nó sẽ được gửi đến Activity.onTouchEvent.
Đó là tất cả sự kiểm soát của bạn. Và hợp lý là những gì bạn thấy được vẽ lên trên một thứ gì đó khác, có cơ hội để xử lý sự kiện cảm ứng trước khi một cái gì đó được vẽ bên dưới nó.
Hãy xem ví dụ trực quan.
Khi một sự kiện liên lạc xảy ra, tất cả mọi người đầu tiên được thông báo về sự kiện này, bắt đầu từ các hoạt động và đi tất cả các cách để quan điểm trên. Sau đó, mọi người đều có cơ hội để xử lý sự kiện, bắt đầu với chế độ xem ở trên cùng và quay trở lại Hoạt động. Vì vậy, Activity là người đầu tiên nghe về nó và người cuối cùng được trao cơ hội để xử lý nó.
Nếu Hoạt động hoặc một số ViewGroup muốn để xử lý các sự kiện liên lạc ngay lập tức (và không cho bất cứ ai khác xuống dòng một cơ hội vào nó) sau đó nó chỉ có thể trở lại true
trong onInterceptTouchEvent()
của nó.
Nếu Chế độ xem (hoặc Nhóm xem) có OnTouchListener
thì sự kiện chạm được xử lý bởi OnTouchListener.onTouch()
. Nếu không, nó sẽ được xử lý bởi onTouchEvent()
. Nếu onTouchEvent()
trả về true
cho bất kỳ sự kiện chạm nào, thì việc xử lý dừng lại ở đó. Không ai khác xuống dòng được một cơ hội ở đó.
Giải thích chi tiết hơn
Biểu đồ trên làm cho mọi thứ đơn giản hơn một chút so với thực tế. Ví dụ, giữa Activity và ViewGroup A (layout gốc) cũng có Window và DecorView. Tôi để chúng ở trên vì chúng ta thường không phải tương tác với chúng. Tuy nhiên, tôi sẽ bao gồm chúng bên dưới. Mô tả bên dưới tuân theo sự kiện chạm thông qua mã nguồn. Bạn có thể nhấp vào liên kết để xem mã nguồn thực tế.
- Hoạt động của
dispatchTouchEvent()
được thông báo về sự kiện liên lạc. Sự kiện cảm ứng được chuyển vào dưới dạngMotionEvent
, chứa tọa độ x, y, thời gian, loại sự kiện và thông tin khác. - Sự kiện cảm ứng được gửi đến cửa sổ
superDispatchTouchEvent()
của Cửa sổ.Window
là một lớp trừu tượng. Việc triển khai thực tế làPhoneWindow
. - Dòng tiếp theo trong dòng để nhận thông báo là số
superDispatchTouchEvent()
của DecorView.DecorView
là cách xử lý thanh trạng thái, thanh điều hướng, khu vực nội dung, v.v. It is actually just aFrameLayout
subclass, chính nó là lớp con củaViewGroup
. - Người tiếp theo nhận thông báo (sửa tôi nếu tôi sai) là chế độ xem nội dung hoạt động của bạn. Đó là những gì bạn đặt làm bố cục gốc của hoạt động trong xml khi bạn tạo bố cục trong Trình chỉnh sửa bố cục của Android Studio. Vì vậy, cho dù bạn chọn một
RelativeLayout
, mộtLinearLayout
hoặcConstraintLayout
, tất cả chúng đều là các lớp con củaViewGroup
. Và ViewGroup được thông báo về sự kiện cảm ứng trongdispatchTouchEvent()
. Đây là ViewGroup A trong sơ đồ của tôi ở trên. ViewGroup
sẽ notify any children nó có sự kiện liên lạc, bao gồm bất kỳViewGroup
trẻ em nào. Đây là ViewGroup B trong sơ đồ của tôi ở trên.- Bất kỳ nơi nào trên đường đi,
ViewGroup
có thể short-circuit quy trình thông báo bằng cách trả lạitrue
choonInterceptTouchEvent()
. - Giả sử không có
ViewGroup
cắt thông báo ngắn, đầu tự nhiên của dòng cho thông báo là khi Chế độ xem củadispatchTouchEvent()
được gọi. - Bây giờ là lúc, để bắt đầu xử lý các sự kiện. If there is an
OnTouchListener
, sau đó nó là cơ hội đầu tiên xử lý sự kiện liên lạc vớionTouch()
. Otherwise, Chế độ xem củaonTouchEvent()
được xử lý. - Bây giờ tất cả các Nhóm xem theo cách đệ quy lên đường có cơ hội xử lý sự kiện chạm theo cùng cách mà
View
đã làm. Mặc dù, tôi không cho biết điều này trong sơ đồ trên, một sốViewGroup
là một phân lớpView
, vì vậy mọi thứ tôi mô tả vềOnTouchListener.onTouch()
vàonTouchEvent()
cũng áp dụng cho Nhóm xem. - Finally, nếu không ai khác muốn, Hoạt động cũng là cơ hội cuối cùng để xử lý sự kiện với
onTouchEvent()
.
FAQ
Khi nào tôi đã từng cần phải ghi đè dispatchTouchEvent()
?
Có thể bạn sẽ không cần, trừ khi bạn cần thực hiện thêm một số định tuyến không xảy ra theo mặc định. Để theo dõi thông báo sự kiện chạm, bạn có thể ghi đè lên onInterceptTouchEvent()
.
Khi nào tôi cần ghi đè onInterceptTouchEvent()
?
Nếu bạn chỉ muốn theo dõi các thông báo chạm đang đến, bạn có thể thực hiện tại đây và trả lại false
.
Tuy nhiên, mục đích chính của việc ghi đè phương pháp này là để cho ViewGroup xử lý một loại sự kiện chạm nhất định trong khi cho phép đứa trẻ xử lý một loại khác. Ví dụ, một ScrollView
thực hiện điều này để xử lý cuộn trong khi để con của nó xử lý một cái gì đó giống như một nút bấm. Ngược lại, nếu chế độ xem con không muốn để cha mẹ đánh cắp sự kiện liên lạc của nó, nó có thể gọi requestDisallowTouchIntercept()
.
Các loại sự kiện chạm là gì?
Những cái chính là
ACTION_DOWN
- Đây là khởi đầu của một sự kiện liên lạc. Bạn phải luôn trả lạitrue
cho sự kiệnACTION_DOWN
trongonTouchEvent
nếu bạn muốn xử lý sự kiện chạm. Nếu không, bạn sẽ không nhận được thêm bất kỳ sự kiện nào được gửi cho bạn.ACTION_MOVE
- Sự kiện này liên tục bị kích hoạt khi bạn di chuyển ngón tay trên màn hình.ACTION_UP
- Đây là sự kiện cuối cùng của sự kiện liên lạc.
Nhân vật thứ hai là ACTION_CANCEL
. Điều này được gọi nếu một ViewGroup lên cây quyết định chặn sự kiện cảm ứng.
Bạn có thể xem các loại MotionEvents khác here. Vì Android đa chạm, các sự kiện cũng được kích hoạt khi các ngón tay khác ("con trỏ") chạm vào màn hình.
Tiếp tục nghiên cứu
- Android onTouchEvent Part 1, Part 2, và Part 3 (video trên YouTube - bản tóm tắt tốt của một số các liên kết bên dưới)
- Mastering the Android Touch System (video kỹ lưỡng bởi nhà phát triển Google)
- Android UI Internal : Pipeline of View's Touch Event Handling
- Managing Touch Events in a ViewGroup (tài liệu Android)
- Input Events (Android d OCS)
- Gestures and Touch Events
- 1. bản vẽ android trên sự kiện chạm
- 2. Sự kiện chạm Javascript chậm trên Android
- 3. Nhận tọa độ của sự kiện chạm trên Android
- 4. Tắt các sự kiện chạm trên WebView trong Android
- 5. Android xử lý sự kiện GUI như thế nào?
- 6. Sự kiện chạm ánh xạ JavaScript tới sự kiện chuột
- 7. Google phân phối kết quả nhanh như thế nào?
- 8. Làm thế nào để đạt được hiệu ứng nghiêng trên Android như trên Windows Phone?
- 9. Sự kiện PropertyChanged của INotifyPropertyChanged được gán như thế nào?
- 10. sự kiện trên máy bay không được kích hoạt trên iPad sau khi chạm một lần?
- 11. Pagerank được tính toán theo cách phân phối như thế nào?
- 12. Phát hiện các sự kiện chạm trên UILabel
- 13. Sự kiện chạm không được kích hoạt trên thẻ video trên safari cho iPhone
- 14. Thư viện/khung khai thác sự kiện phân phối trên không tối thiểu?
- 15. Sự kiện MouseDown không được phân phối cho đến khi MouseUp khi có Nguồn Kéo
- 16. kích hoạt sự kiện chạm theo cách thủ công
- 17. Android 4 Sự cố kiểm tra lượt truy cập Chrome trên sự kiện chạm sau khi chuyển đổi CSS
- 18. Sự cố phân phối lại Microsoft.mshtml.dll
- 19. Android Toasts có các sự kiện chạm trên một số điện thoại, chứ không phải trên những người khác
- 20. Các ngắt được xử lý như thế nào trên SMP?
- 21. Chạm vào Sự kiện trong Windows Phone 7 Mango IE
- 22. Sự kiện nhấp vào nút trên Android
- 23. Sự kiện chạm có hoạt động với SVG không?
- 24. Sự kiện "touchmove" trên hệ thống android: Transformer Prime
- 25. Sự phối hợp các quan điểm của trẻ được xử lý tốt nhất trong MVP như thế nào?
- 26. Sự kiện chạm được xử lý bởi nhiều chế độ xem
- 27. android: Cách nhận vị trí văn bản từ sự kiện chạm
- 28. Chạm dài trên bề mặt (android)
- 29. Trình xử lý sự kiện hoạt động như thế nào?
- 30. jQuery live() xóa thuộc tính sự kiện chạm iPhone?
Bạn có bất kỳ loại tài liệu mô tả này? – DJClayworth
Giới thiệu về điều phối: Tôi có thể đọc các nhận xét về mã nguồn và chức năng. Giới thiệu về trật tự xem Traversal - Tôi đã đọc nó trong một số tài liệu, chắc chắn trên developer.android.com, nhưng không thể nói chính xác cái nào. –
Dù sao, bắt đầu tốt: http://developer.android.com/guide/topics/ui/ui-events.html –