تكرار السؤال: …
الإجابة المختصرة
تتحكم في مسار اللمس عبر dispatchTouchEvent، وتقرر الحاوية اعتراضا عبر onInterceptTouchEvent، بينما تتعامل الـ View مع اللمس الفعلي في onTouchEvent.
الشرح
تبدأ لمسة المستخدم من أعلى الشجرة نزولاً للأبناء عبر dispatchTouchEvent. يمكن للـ ViewGroup فحص اللمسة واعتراضها بالعودة بـ true من onInterceptTouchEvent (مثل حركة التمرير في ScrollView)، مما يرسل حدث ACTION_CANCEL للابن الحالي ويوجه بقية الأحداث لـ onTouchEvent الخاص بالحاوية. كما يمكن للابن طلب عدم اعتراض اللمسة عبر requestDisallowInterceptTouchEvent(true).
مثال بالكود
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
return when (ev.actionMasked) {
MotionEvent.ACTION_MOVE -> shouldInterceptScroll(ev) // اعتراض التمرير
else -> false
}
}
override fun onTouchEvent(event: MotionEvent): Boolean {
// تنفيذ حركة السحب الفعلية
return gestureDetector.onTouchEvent(event)
}أخطاء شائعة
- إرجاع true في ACTION_DOWN داخل onInterceptTouchEvent دون قصد، مما يمنع الأبناء من استقبال أي أحداث نقر تمامًا.