ScrollView巢狀ScrollView時的滑動衝突問題(同向滑動)
阿新 • • 發佈:2019-01-30
當ScrollView內部再巢狀另一個ScrollView時,就會出現滑動衝突問題,經常看到的就是,內部滑動失效。
通過對事件分發機制的瞭解
- dispatchTouchEvent:負責事件的分發
- onInterceptTouchEvent:判斷是否攔截某個事件
- onTouchEvent:消費點選事件
事件傳遞遵循的順序:Activity->Window->DecorView->頂層View->子View
我們可以通過對事件的攔截處理,來解決這個問題。
1、佈局檔案
<ScrollView android:id="@+id/programPlayParentScroll"android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="none" android:focusableInTouchMode="false"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ScrollView android:id="@+id/programPlayMusicListScroll" android:layout_width="match_parent" android:layout_height="100dp" android:scrollbars="none" android:layout_marginTop="80dp"/> </LinearLayout> </ScrollView>
2、解決方法
當父類佈局滑動時,父類攔截事件,子類佈局.getParent().requestDisallowInterceptTouchEvent(false)
當子類佈局滑動時,父類不攔截事件,子類佈局.getParent().requestDisallowInterceptTouchEvent(true)
具體程式碼如下:
programPlayParentScroll.setOnTouchListener(object : View.OnTouchListener{
override fun onTouch(p0: View?, p1: MotionEvent?): Boolean { programPlayMusicListScroll.parent.requestDisallowInterceptTouchEvent(false) return false } }) programPlayMusicListScroll.setOnTouchListener(object : View.OnTouchListener{ override fun onTouch(p0: View?, p1: MotionEvent?): Boolean { p0.parent.requestDisallowInterceptTouchEvent(true) return false } })