有谁知道如何修改ViewPager的敏感度?
目前我使用来自android v4支持库的ViewPager来实现我自己的照片查看器。
然而,默认的ViewPager过于敏感,当我的手指触摸屏幕并移动非常短的(可能仅0.5厘米)。然后将切换ViewPager以滚动到下一个/上一个照片视图。
有没有办法覆盖ViewPager的默认行为以降低灵敏度?
感谢您的回复。
答案 0 :(得分:4)
我从兼容库的src检查了ViewPager.java,似乎没有办法通过xml或某些setter来实现。 ViewPager的代码如下:
final float density = context.getResources().getDisplayMetrics().density;
mFlingDistance = (int) (MIN_DISTANCE_FOR_FLING * density);
mCloseEnough = (int) (CLOSE_ENOUGH * density);
mDefaultGutterSize = (int) (DEFAULT_GUTTER_SIZE * density);
正如您所看到的,它使用它的内部常数来确定投掷距离等。
好消息是:您可以将ViewPager(此处应考虑其许可证)复制到您的代码中并将其扩展,例如:从xml属性获得距离。
答案 1 :(得分:3)
您可以像这样反映mFlingDistance字段:
Field mFlingDistance;
mFlingDistance = ViewPager.class.getDeclaredField("mFlingDistance");
mFlingDistance.setAccessible(true);
// Set custom value:
mFlingDistance.set(mPager, 30);
答案 2 :(得分:0)
虽然PethőJonatán的指针很好,可以实现更好的灵敏度,但随着击球距离的增加,您可能还希望降低MinimumVelocity。
您可能要在onCreate中初始化viewpager之后执行此操作:
viewPager = findViewById(R.id.viewPager);
Field mFlingDistance;
Field mMinimumVelocity;
try {
mFlingDistance=ViewPager.class.getDeclaredField("mFlingDistance");
mMinimumVelocity=ViewPager.class.getDeclaredField("mMinimumVelocity");
mFlingDistance.setAccessible(true);
mMinimumVelocity.setAccessible(true);
//customize the values
mFlingDistance.set(viewPager, 10);
mMinimumVelocity.set(viewPager, 400);
} catch (Exception e) {
e.printStackTrace();
}
答案 3 :(得分:0)
对于ViewPager2
,请使用反射提取并增加mTouchSlop
。
private 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*8) // "8" was obtained experimentally
}
从视图分页器中调用此功能
val viewPager: ViewPager2 = view.findViewById(R.id.pager)
viewPager.reduceDragSensitivity()
Java版本
private void reduceDragSensitivity() {
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*4);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}