如何让 ViewPager2 不那么敏感?

How to make ViewPager2 less sensitive?

我在我的应用程序中使用 ViewPager2,它有三个页面,每个页面显示不同的内容,问题是 ViewPager 会更改页面太明智了,即使有人向下滚动并且错误地移动了手指向右或向左一点。

那么我怎样才能让 ViewPager 不那么敏感呢? ViewPager2 创建于 Activity

这是我初始化 ViewPager 的代码:

private lateinit var viewPager: ViewPager2
private lateinit var adapterView: ViewPagerAdapter

private fun initViewPager() {
    adapterView.addFragment(ElencoFragment())
    adapterView.addFragment(TestataFragment())
    adapterView.addFragment(CorpoFragment())
    adapterView.notifyDataSetChanged()

    viewPager.adapter = adapterView
    ...
}


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    viewPager = findViewById(R.id.pager)
    adapterView = ViewPagerAdapter(supportFragmentManager, lifecycle)
    ...
}

我的适配器:

 class ViewPagerAdapter
        (manager: FragmentManager, lifecycle: Lifecycle) :
        FragmentStateAdapter(manager, lifecycle) {

        private var fragmentList: ArrayList<Fragment> = ArrayList()

        override fun getItemCount(): Int {
            return fragmentList.size
        }

        override fun createFragment(position: Int): Fragment {
            return fragmentList[position]
        }

        fun addFragment(fragment: Fragment) {
            fragmentList.add(fragment)
        }
    }

这很有效 在我的方法中,我将片段存储为 arrayList

里面Activity

val listOfFragment = arrayListOf<Fragment>(
                F1(),
                F2(),
                F3(),
           
            )
            val adapter = TabsPagerAdapter(
                listOfFragment,
                requireActivity().supportFragmentManager,
                requireActivity(),
                0,
                lifecycle

            )

            viewPager1.adapter = adapter           

适配器

class TabsPagerAdapter(val array: ArrayList<Fragment>,
                       val manager: FragmentManager,
                       val context: Context,
                       private val numTabs: Int,
                       lifecycle: Lifecycle): FragmentStateAdapter(manager, lifecycle){
    override fun createFragment(position: Int): Fragment {
        return array[position]
    }

    override fun getItemCount(): Int {
        return array.size
     }
    private fun getReadableTabPosition(position: Int) = position + 1

}

注意:灵敏度可能取决于您当前使用的机器运行尝试切换其他设备

要降低 ViewPager 水平滚动的灵敏度,试试这个扩展

fun ViewPager2.reduceDragSensitivity(f: Int = 4) {
    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*f)       // "8" was obtained experimentally
}

Source

这应该是@Navjot的kotlin代码的java代码。 sensitivity = 3;sensitivity = 4; 之类的东西对我来说很好。

soure and other solutions

private void reduceDragSensitivity(int sensitivity) {
    try {
        Field ff = ViewPager2.class.getDeclaredField("mRecyclerView") ;
        ff.setAccessible(true);
        RecyclerView recyclerView =  (RecyclerView) ff.get(viewPager);
        Field touchSlopField = RecyclerView.class.getDeclaredField("mTouchSlop") ;
        touchSlopField.setAccessible(true);
        int touchSlop = (int) touchSlopField.get(recyclerView);
        touchSlopField.set(recyclerView,touchSlop * sensitivity);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}