有没有一种方法可以自定义ViewPager滚动的阈值?

9

你尝试过扩展 ViewPager 并覆盖那个方法吗? - Cat
determineTargetPage是一个私有方法。 - almalkawi
然后重写构造函数,创建自己的自定义 initViewPager 方法,并让您的自定义构造函数调用该方法。您可以在那里设置 fling 距离和速度。 - Cat
我不太明白。determineTargetPage是由ViewPager的onTouchEvent调用的,那么重写构造函数会有什么帮助呢? - almalkawi
它设置了抛掷距离和速度,这些因素是determineTargetPage的决定因素,决定是否切换页面。 - Cat
谢谢您的建议。然而,mFlingDistance和mMinimumVelocity/mMaximumVelocity是私有字段,因此在扩展ViewPager时无法访问它们。 - almalkawi
1个回答

11

在这里稍微冒险一下,我毫不怀疑您可能需要调整此概念和/或代码。

我建议您按上面的评论进行扩展 ViewPager 并覆盖其公共构造函数,并调用一个自定义方法,该方法是initViewPager()的克隆(在您提供的源中看到)。但是,正如您指出的那样,mFlingDistancemMinimumVelocitymMaximumVelocity是私有字段,因此无法通过子类访问它们。

(注意:如果需要,您还可以在调用构造函数后更改这些方法。)

这里有点棘手。在Android中,我们可以使用Java反射API来使这些字段可访问。

应该像这样工作:

Class clss = getClass.getSuperClass();
Field flingField = clss.getDeclaredField("mFlingDistance"); // Of course create other variables for the other two fields
flingField.setAccessible(true);
flingField.setInt(this, <whatever int value you want>); // "this" must be the reference to the subclass object
然后,使用您想要的任何值重复此过程,以另外两个变量为例。您可能需要查看源代码中这些变量是如何计算的。
很不幸,尽管我很想推荐使用反射来覆盖私有方法 determineTargetPage(),但我认为即使使用广泛的反射 API,也无法实现这一点。

感谢Eric解释你的方法。在正式的编程代码中,我不能使用反射并依赖于实现细节(比如私有成员变量)-这太冒险了。 - almalkawi
抱歉,您想要做的事情可能无法实现。除非您复制了整个源代码并自行修改... - Cat
尽管你的方法有些取巧,但由于似乎没有更好的控制距离和速度参数的干净方法,我将把你的答案标记为已接受的答案。 - almalkawi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接