dialog中處理滑鼠事件

bug背景:在dialog中,有listview,滾動滑鼠滾輪,listview上下滾動,監聽滑鼠事件不回撥;只有在listview的上下邊界時才回撥;視窗為dialog,15秒自動消失,有滑鼠動作時會重新計時,異常—>>>延時15秒後再次點選檢視中的button時,log顯示空指標,顯然佈局被銷燬的瞬間點選button導致。
研究了幾天,結論是焦點搶佔了;android提供了監聽滑鼠事件的回撥函式:

onGenericMotionEvent

大致意思是說:只有當一個普通的移動事件沒有被dialog中的任何view處理、消費掉時 才會回撥這個方法;

dispatchGenericMotionEvent

當處理一般的滑鼠動作事件時就會回撥此方法。

在他們被分派到窗體之前,我們可以重寫這個回撥方法來攔截所有的滑鼠事件;一定要呼叫這個滑鼠移動事件的實現才能確保事件被正常處理。

另外,我們再進入到上圖中的方法體重的一個方法:superDispatchGenericMotionEvent

被自定義檢視所回撥,如dialog,將滑鼠基本動作事件進一步傳遞到檢視層。應用開發人員不需要呼叫這個方法。。 難道我不是應用開發者了? 

現在我的檢視就是處在dialog環境中,而且其中又有listview控制元件,所以不能用onGenericMotionEvent,必須要先攔截滑鼠事件而後進行操作,即呼叫dispatchGenericMotionEvent。

類比下:touch事件  與genericMotionEvent事件的分發路徑

此圖是之前畫過的,為了分析view檢視中焦點傳遞路徑;現在將滑鼠事件一同加以類比,如出一轍。