如何修改viewpager的灵敏度?

时间:2012-08-27 02:29:51

标签: android

有谁知道如何修改ViewPager的敏感度?

目前我使用来自android v4支持库的ViewPager来实现我自己的照片查看器。

然而,默认的ViewPager过于敏感,当我的手指触摸屏幕并移动非常短的(可能仅0.5厘米)。然后将切换ViewPager以滚动到下一个/上一个照片视图。

有没有办法覆盖ViewPager的默认行为以降低灵敏度?

感谢您的回复。

4 个答案:

答案 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();
    }
}

所有Alexander ShevelevMahmoud Shabat的信用。