我试图获得与这个问题完全相同的效果。我为此苦苦挣扎,然后阅读了@wnafee 的答案(没有它我无法做到)。
但是后来我很难实现从答案中听起来很简单的东西。我在实现它时遇到了很多麻烦,以至于我可能没有正确理解答案,但是由于我没有在 Compatibility 库的同一个包中工作,所以存在太多无法访问的 API 问题。
在我尝试了一些方法之后(没有一个成功,而且它们非常复杂),我转向了一个稍微不同的方向,现在它就像一个魅力。我使用了一些反射,对于那些从未使用过的人,不要担心它真的是反射的基础。
我不确定它是否是最好的解决方案,但它对我有用,所以如果你想使用它,欢迎你。请阅读 Wnafee 示例,因为它解释了我所做的一些事情。
为了完成这项任务,您应该遵循我的三部分解决方案。(将带您 3-10 分钟)
第一部分:
正如 Wnafee 所说,我刚刚通过从此处复制粘贴源代码制作了自己的 EdgeEffect 类,
(只需确保将 AOSP /res/drawable 目录中的 overscroll_edge 和 overscroll_glow 可绘制对象复制到您自己的项目中,因为它们是 android 内部的)
我只做了 2 个非常小的改动:
- 我声明该类扩展了 EdgeEffectCompat (我称我的类
EdgeEffectForEarlyVersions
)。public class EdgeEffectForEarlyVersions extends EdgeEffectCompat
. 进行此更改的原因是mLeftEdge
andmRightEdge
属于EdgeEffectCompat
.
- 在“我的”新类的构造函数的第一行,我添加了对父构造函数的调用
super(context);
。由于没有默认构造函数,EdgeEffectCompat
您必须显式调用构造函数。
第二部分
除此之外,我还编写了另一个函数。该函数的目的是,在早期版本(ICS 之前)的情况下,我们希望使用EdgeEffectForEarlyVersions
我们刚刚复制的那个。为了达到这个目的,我使用了反射。
这是功能:
private static void changeEdgeEffectCompactOnEarlyVersions(ViewPager viewPager, Context context)
{
/* In case that the version is earlier than 14 there is only empty implementation for the edge effect, therefore we change it.
* for more information look on the following links:
* 1. http://stackoverflow.com/questions/10773565/visual-indication-of-over-scroll-in-android
* 2. http://grepcode.com/file/repo1.maven.org/maven2/com.google.android/support-v4/r7/android/support/v4/view/ViewPager.java#ViewPager.0mLeftEdge
* 3. http://grepcode.com/file/repo1.maven.org/maven2/com.google.android/support-v4/r7/android/support/v4/widget/EdgeEffectCompat.java#EdgeEffectCompat
*/
if (Build.VERSION.SDK_INT < 14)
{
try
{
Class<ViewPager> viewPagerClass = ViewPager.class;
//Get the left edge field, since it is private we used getDeclaredField and not getDeclared
Field leftEdge = viewPagerClass.getDeclaredField("mLeftEdge");
leftEdge.setAccessible(true);
//Get the right edge field, since it is private we used getDeclaredField and not getDeclared
Field rightEdge = viewPagerClass.getDeclaredField("mRightEdge");
rightEdge.setAccessible(true);
EdgeEffectForEarlyVersions leftEdgeEffect = new EdgeEffectForEarlyVersions(context);
EdgeEffectForEarlyVersions rightEdgeEffect = new EdgeEffectForEarlyVersions(context);
//Set the mLeftEdge memeber of viewPager not to be the default one, but to be "our" edgeEffect
leftEdge.set(viewPager, leftEdgeEffect);
//Set the mRightEdge memeber of viewPager not to be the default one, but to be "our" edgeEffect
rightEdge.set(viewPager, rightEdgeEffect);
}
catch (Exception ex)
{
Log.e("refelection", ex.getMessage());
}
}
}
第三部分
现在剩下要做的就是在拥有 ViewPager 实例之后调用该函数,仅此而已。
我希望它会帮助某人。