Search code examples
androidkotlinandroid-viewpager2

Viewpager2 swipe gesture only horizontally Android


How can I prevent diagonal swipe on Viewpager2, only allow to swipe if gesture is strictly horizontally.

I dot not want this

I want this


Solution

  • This how make it work

    source from Medium

     fun ViewPager2.reduceDragSensitivity() {
        val recyclerViewField = ViewPager2::class.java.getDeclaredField("mRecyclerView")
        recyclerViewField.isAccessible = true
        val recyclerView = recyclerViewField.get(this) as RecyclerView
        val touchSlopField = RecyclerView::class.java.getDeclaredField("mTouchSlop")
        touchSlopField.isAccessible = true
        val touchSlop = touchSlopField.get(recyclerView) as Int
        touchSlopField.set(recyclerView, touchSlop*3)
    }
    

    Also you must have Recyclerview like this

     <androidx.core.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layerType="hardware"
            android:orientation="vertical"
            android:overScrollMode="never"
            android:scrollbars="vertical"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">
    
    
            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/recyclerArtist"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center_horizontal"
                android:clipToPadding="false"
                android:layerType="hardware"
                android:orientation="vertical"
                android:overScrollMode="never" />
    
    
        </androidx.core.widget.NestedScrollView>
    

    also

    ViewCompat.setNestedScrollingEnabled(recyclerView,false)