如何让 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
}
这应该是@Navjot的kotlin代码的java代码。 sensitivity = 3;
或 sensitivity = 4;
之类的东西对我来说很好。
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();
}
}
我在我的应用程序中使用 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
}
这应该是@Navjot的kotlin代码的java代码。 sensitivity = 3;
或 sensitivity = 4;
之类的东西对我来说很好。
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();
}
}