Tempat terbaik untuk menghilangkan mitos ini adalah kode sumber. Dokumen itu sangat tidak memadai untuk menjelaskan hal ini.
dispatchTouchEvent sebenarnya didefinisikan pada Activity, View, dan ViewGroup. Anggap saja sebagai pengontrol yang memutuskan cara mengarahkan acara sentuh.
Misalnya, kasus paling sederhana adalah pada View.dispatchTouchEvent yang akan merutekan acara sentuh ke OnTouchListener.onTouch jika ditentukan atau ke metode ekstensi onTouchEvent .
Untuk ViewGroup.dispatchTouchEvent, berbagai hal jauh lebih rumit. Perlu mengetahui yang mana dari salah satu pandangan anaknya yang harus mendapatkan acara (dengan memanggil child.dispatchTouchEvent). Ini pada dasarnya adalah algoritma pengujian hit di mana Anda mengetahui persegi panjang pembatas tampilan anak mana yang berisi koordinat titik sentuh.
Tetapi sebelum dapat mengirimkan acara ke tampilan anak yang sesuai, orang tua dapat memata-matai dan / atau mencegat acara tersebut bersama-sama. Inilah yang ada di dalamInterceptTouchEvent . Jadi ia memanggil metode ini terlebih dahulu sebelum melakukan pengujian hit dan jika acara tersebut dibajak (dengan mengembalikan true dari onInterceptTouchEvent) mengirimkan ACTION_CANCEL ke tampilan anak sehingga mereka dapat meninggalkan pemrosesan acara sentuh mereka (dari acara sentuh sebelumnya) dan sejak saat itu dan seterusnya semua acara sentuh di tingkat induk dikirim ke onTouchListener.onTouch (jika ditentukan) atau onTouchEvent (). Juga dalam kasus itu, onInterceptTouchEvent tidak pernah dipanggil lagi.
Apakah Anda bahkan ingin menimpa [Activity | ViewGroup | View] .dispatchTouchEvent? Kecuali Anda melakukan perutean kustom, Anda mungkin tidak seharusnya.
Metode ekstensi utama adalah ViewGroup.onInterceptTouchEvent jika Anda ingin memata-matai dan / atau mencegat acara sentuh di tingkat induk dan View.onTouchListener / View.onTouchEvent untuk penanganan acara utama.
Semua dalam semua desain imo yang terlalu rumit tetapi apis android lebih condong ke arah fleksibilitas daripada kesederhanaan.