我试图获得与此问题中提出的完全相同的效果。我为此苦苦挣扎,然后我阅读了@wnafee 的答案(没有它我无法做到)。
但是我很难实现从答案中听起来很简单的东西。
我在实现它时遇到了很多麻烦,以至于我可能没有正确理解答案,但是由于我没有在兼容库的同一个包中工作,所以存在太多无法访问的 API 问题。
在我尝试了一些方法后(没有一个成功,而且它们非常复杂),我转向了一个稍微不同的方向,现在它就像一个魅力。我用了一些反射,没用过的人不用担心,这真的是反射的基础。
我不确定它是否是目前最好的解决方案,但它对我有用,所以如果您想使用它,欢迎您。请阅读 Wnafee 示例,因为它解释了我所做的一些事情。
为了完成这项任务,您只需遵循我的三部分解决方案即可。 (需要 3-10 分钟)
第一部分:
正如 Wnafee 所说,我刚刚通过复制粘贴 here 的源代码制作了自己的 EdgeEffect 类,
(只要确保复制 overscroll_edge 和 overscroll_glow
AOSP /res/drawable 目录中的drawables 到你自己的项目
因为它们是 android 内部的)
我只做了 2 个非常小的改动:
- 我声明该类扩展了 EdgeEffectCompat(我将我的类称为
EdgeEffectForEarlyVersions)。 public class EdgeEffectForEarlyVersions extends EdgeEffectCompat。进行此更改的原因是 mLeftEdge 和 mRightEdge 的类型为 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 实例之后调用该函数,仅此而已。
我希望它会对某人有所帮助。