Bunu demystify için en iyi yer kaynak kodudur. Belgeler bunu açıklamak konusunda ne yazık ki yetersizdir.
dispatchTouchEvent aslında Etkinlik, Görünüm ve Görünüm Grubu'nda tanımlanır. Dokunma olaylarını nasıl yönlendireceğine karar veren bir denetleyici olarak düşünün.
Örneğin, en basit durumda bunun View.dispatchTouchEvent birine dokunma olayı güzergahın OnTouchListener.onTouch o tanımlanmış veya uzatma yöntemi için eğer onTouchEvent .
İçin ViewGroup.dispatchTouchEvent şeyler yol daha karmaşık bulunmaktadır. Alt görünümlerinden hangisinin olayı alması gerektiğini bulması gerekir (child.dispatchTouchEvent öğesini çağırarak). Bu temel olarak, hangi alt görünümün sınırlayıcı dikdörtgeninin temas noktası koordinatlarını içerdiğini anladığınız bir çarpma testi algoritmasıdır.
Ancak, olayı uygun çocuk görünümüne göndermeden önce, ebeveyn olayı hep birlikte gözetleyebilir ve / veya araya alabilir. Bu nedir onInterceptTouchEvent için vardır. Bu nedenle, isabet testini yapmadan önce bu yöntemi çağırır ve olay kaçırılırsa (onInterceptTouchEvent'ten true değerini döndürerek) , çocuk olaylarına bir ACTION_CANCEL gönderir , böylece dokunma olayı işlemlerini (önceki dokunma olaylarından) ve daha sonra geri gönderebilirler. üst düzeydeki tüm dokunma olayları onTouchListener.onTouch (tanımlanmışsa) veya onTouchEvent () öğesine gönderilir . Ayrıca bu durumda, onInterceptTouchEvent bir daha asla çağrılmaz.
[Etkinlik | ViewGrup | Görünüm] .dispatchTouchEvent'i geçersiz kılmak ister misiniz? Eğer bazı özel yönlendirme yapmıyorsanız muhtemelen yapmamalısınız.
Üst düzeyde dokunma olayını casusluk ve / veya durdurmak istiyorsanız ana uzantı yöntemleri ViewGroup.onInterceptTouchEvent ve ana olay işleme için View.onTouchListener / View.onTouchEvent yöntemidir.
Sonuçta aşırı karmaşık tasarım imo ama android apis basitlikten daha fazla esnekliğe doğru eğilir.