ที่ดีที่สุดในการ demystify นี้เป็นรหัสที่มา เอกสารไม่เพียงพออย่างมากเกี่ยวกับการอธิบายเรื่องนี้
dispatchTouchEvent มีการกำหนดจริงในกิจกรรมดูและดูกลุ่ม คิดว่ามันเป็นตัวควบคุมที่ตัดสินใจว่าจะกำหนดเส้นทางเหตุการณ์สัมผัส
ตัวอย่างเช่นกรณีที่ง่ายที่สุดคือการView.dispatchTouchEventซึ่งจะเส้นทางเหตุการณ์สัมผัสทั้งOnTouchListener.onTouchถ้ามันกำหนดไว้หรือวิธีการขยายonTouchEvent
สำหรับสิ่งที่ViewGroup.dispatchTouchEventมีความซับซ้อนมากขึ้น จำเป็นต้องทราบว่าหนึ่งในมุมมองลูกของมันควรได้รับเหตุการณ์ (โดยการเรียก child.dispatchTouchEvent) นี่เป็นอัลกอริธึมการทดสอบการเข้าชมที่คุณคิดออกว่าขอบเขตการโยงของมุมมองลูกใดที่มีพิกัดจุดสัมผัส
แต่ก่อนที่จะสามารถส่งเหตุการณ์ไปยังมุมมองลูกที่เหมาะสมผู้ปกครองสามารถสอดแนมและ / หรือขัดขวางเหตุการณ์ทั้งหมดเข้าด้วยกัน นี่คือสิ่งที่onInterceptTouchEventจะมีสำหรับ ดังนั้นจึงเรียกวิธีนี้ก่อนที่จะทำการทดสอบการตีและหากเหตุการณ์ถูกจี้ (โดยการคืนค่าจริงจาก onInterceptTouchEvent) มันจะส่งACTION_CANCELไปยังมุมมองลูกเพื่อให้พวกเขาสามารถละทิ้งการประมวลผลกิจกรรมการสัมผัส (จากกิจกรรมการสัมผัสก่อนหน้านี้) กิจกรรมการสัมผัสทั้งหมดที่ระดับผู้ปกครองจะถูกส่งไปยังonTouchListener.onTouch (ถ้ากำหนดไว้) หรือonTouchEvent () นอกจากนี้ในกรณีนั้น onInterceptTouchEvent จะไม่ถูกเรียกอีกครั้ง
คุณต้องการแทนที่ [กิจกรรม | ViewGroup | View] .dispatchTouchEvent หรือไม่ หากคุณไม่ได้กำหนดเส้นทางเองคุณอาจไม่ควรทำ
วิธีการขยายหลักคือ ViewGroup.onInterceptTouchEvent หากคุณต้องการสอดแนมและ / หรือดักจับเหตุการณ์การสัมผัสที่ระดับผู้ปกครองและ View.onTouchListener / View.onTouchEvent สำหรับการจัดการเหตุการณ์หลัก
ทั้งหมดในทุกการออกแบบที่ซับซ้อนมากเกินไป imo แต่ Android apis พึ่งพาความยืดหยุ่นมากกว่าความเรียบง่าย