1. 程式人生 > >ScrollView巢狀ScrollView時的滑動衝突問題(同向滑動)

ScrollView巢狀ScrollView時的滑動衝突問題(同向滑動)

當ScrollView內部再巢狀另一個ScrollView時,就會出現滑動衝突問題,經常看到的就是,內部滑動失效。

通過對事件分發機制的瞭解

  1. dispatchTouchEvent:負責事件的分發
  2. onInterceptTouchEvent:判斷是否攔截某個事件
  3. 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
}
})