天天看點

Fragment和scrollview事件沖突的解決方法

每次網上找控件的時候,集合在一起的時候就困惑了,很多沖突和需要優化的,不是簡單的搬磚,沖突這裡主要講的是控件之間的沖突,為了解決控件的沖突,不得不提事件的分發了。

我們先來看看事件分發機制原理:http://blog.csdn.net/guolin_blog/article/details/9097463 這裡已經有詳細介紹就不多說了。

然後我們來看看要解決的問題:網上集合了兩個library,一個是仿京東下拉重新整理控件,一個是無限輪播左右滑動控件,上下滑動和左右滑動沖突了,想要達到的效果自己下個京東看看。

Fragment和scrollview事件沖突的解決方法

找到對應的的類打log顯示如下:

滑動時log

Fragment和scrollview事件沖突的解決方法

點選時候的log:

Fragment和scrollview事件沖突的解決方法

其實沒有改什麼,就是添加了dispatchTouchEvent、onTouchEvent和setOnTouchListener,發現和網上的不太對,因為沒有列印onTouchEvent,好奇怪。然後搜尋了看到簡書中有一篇關于文章Android 事件分發機制的,寫得特别好,評論也特别。

http://www.jianshu.com/p/e99b5e8bd67b

1.看圖可以知道假設有三層(Activity,ViewGroup,View),當在第二層ViewGroup中的dispatchTouchEvent傳回false時,才回去執行上父布局也就是上一個布局所在類中執行onTouchEvent。也就是同一個類中,dispatchTouchEvent級别比onTouchEvent高。

2.當某個類中onTouchEvent傳回為false時,會執行向父類onTouchEvent,以此類推,否則被消費。正常情況下是醬紫,當某個控件不能被電擊就不會這樣執行了。這裡忽略,有興趣的話自己去研究。

3.當父ViewGroup下面又有一個子ViewGroup接着才是View,那麼點選了父親ViewGroup下面的孩子ViewGroup,View又是繼承baseView,那麼這個baseView會報錯,dispatchTouchEvent一直不停列印ACTION_DOWN,這個也不知道原因。除非把這個View和baseView的攔截事件都去掉。但這樣如何攔截呢??????

發現真的很難去處理這個滑動沖突的,本人對Touch事件分發也是雲裡霧裡,攔截起來好困難的感覺,真無從下手。。。。。。。。。。。。。。

最後隻能把京東的重新整理換成自帶的SwipeRefreshLayout了,堆砌的控件沒什麼意思,還是要多看源碼,了解内部機制才能有進步。。。

如有高手知曉,可以告訴小弟是如何解決的,小弟才疏學淺。虛心求教。

demo位址:https://github.com/1948421773/musicshop001

繼續閱讀