ScrollView ViewPager RecycleView 巢狀 滑動衝突 整理 解決方案
前一段時間有人問關於滑動衝突的問題,所以參照網路一些文章抽時間做了一下整理。
滑動衝突
三種會出現滑動衝突根本情況:
1方向不同(Scrollview裡巢狀viewpager)
2方向相同(Scrollview裡巢狀recycle,Viewpager裡巢狀viewpager)
3前兩種的巢狀(例:Scrollview裡viewpager裡recycle)
問題產生原因:
同一觸控事件 在 同一時刻 只能有一個view或viewgroup 進行消費
解決方案:
控制讓 觸控事件在某一時刻時間 由應該執行的那個view或viewgroup 執行消費(這一時刻由這個,那一時刻由那個)。
方向不同的兩種方法:
1外部:
重寫父view。如onInterceptTouchEvent,如果是父view需要的方向在滑動,就攔截,如果不是就不攔截。如ondispathTouchEvent,如果父viw需要就不分發,不如要就分發。如Scrollview裡巢狀viewpager,在Scrollview中不分發或攔截上下方向。
2內部:
重新子view,如果需要就在ondispathTouchEvent請求父view不攔截,getParnt().requestDisallowInterceptTouchEvent(true);
方向相同的方法:
1viewpager與viewpager的巢狀,一般重寫子viewpager,在ondispath里根據父viewpager是第幾頁和子view第幾頁的條件按需求判斷是否子viewpager是否需要滑動,需要的話就請求父viewpager不攔截
2scrollview巢狀recycle,出現的問題較多,如:recycle顯示不完全安卓6.0以上的問題(重寫recycle的layoutmanager或在recycle外巢狀一個relative,都有效但是有的機型無效),滑動衝突(設定按照Scrollview的滑動recyclerView.setNestedScrollingEnabled(false);),巢狀佈局,不顯示頂部佈局控制元件,直接顯示下面recycle的第一個item(設定滑動到頂部scrollto),scrollview下巢狀佈局有時會什麼也消失不出來,加入fillViewport,沒有此屬性時Scrollview下的view會按照wrap_content計算。使用desgin庫的NestedScrollview來巢狀recycle,直接就不用要處理了。
3scrollview巢狀scrollview,同理與viewpager與viewpager的巢狀。都是根據需求,來請求不攔截的。
前兩種的巢狀解決方法:
有空寫吧
touch分發機制
https://www.jianshu.com/p/e99b5e8bd67b