1

我正在尝试为 ViewPager 中的项目设置动画,而 PageTransformer 符合要求。我希望它向后兼容 Android 2.2,所以我使用 support v4 库。然而...

由于仅从 Android 3.0 及更高版本开始支持属性动画,因此在早期平台版本上的 > ViewPager 上设置 PageTransformer 将被忽略。

所以 PageTransformer 不能在旧版本上工作

我正在使用Jake Wharton 的 NineOldAndroids库,所以我可以使用该 API,但我不确定如何为 ViewPager 制作动画。

我怎么能这样做?

4

2 回答 2

8

您需要PageTransformer使用AnimatorProxy包装器来实现在视图上设置转换属性。

然后困难的部分是ViewPager将忽略PageTransformer较低的 API 版本。所以你需要修改ViewPager自身才能使用PageTransformer.

在 GitHub 上有一个支持库的分叉版本,它允许这样做以及使用 NineOldAndroids 动画师进行自定义片段转换。使用 animator-transition 分支。这是一个 maven 项目,因此您可以从 v4 子目录构建它。

public class ZoomOutPageTransformer implements PageTransformer {
    private static float MIN_SCALE = 0.85f;
    private static float MIN_ALPHA = 0.5f;

    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();
        int pageHeight = view.getHeight();

        AnimatorProxy proxy = AnimatorProxy.wrap(view);

        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            proxy.setAlpha(0);
        } else if (position <= 1) { // [-1,1]
            // Modify the default slide transition to shrink the page as well
            float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
            float vertMargin = pageHeight * (1 - scaleFactor) / 2;
            float horzMargin = pageWidth * (1 - scaleFactor) / 2;
            if (position < 0) {
                proxy.setTranslationX(horzMargin - vertMargin / 2);
            } else {
                proxy.setTranslationX(-horzMargin + vertMargin / 2);
            }

            // Scale the page down (between MIN_SCALE and 1)
            proxy.setScaleX(scaleFactor);
            proxy.setScaleY(scaleFactor);

            // Fade the page relative to its size.
            proxy.setAlpha(MIN_ALPHA +
                (scaleFactor - MIN_SCALE) /
                (1 - MIN_SCALE) * (1 - MIN_ALPHA));
        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            proxy.setAlpha(0);
        }
    }
}
于 2013-04-14T23:31:03.657 回答
3

正如@mark.kedzierski 所说,从这里复制了 ViewPager 类并删除了版本的 if 语句(检查下面)并将其命名为 TransformableViewPager

public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) {
    if (Build.VERSION.SDK_INT >= 11) {
        final boolean hasTransformer = transformer != null;
        final boolean needsPopulate = hasTransformer != (mPageTransformer != null);
        mPageTransformer = transformer;
        setChildrenDrawingOrderEnabledCompat(hasTransformer);
        if (hasTransformer) {
            mDrawingOrder = reverseDrawingOrder ? DRAW_ORDER_REVERSE : DRAW_ORDER_FORWARD;
        } else {
            mDrawingOrder = DRAW_ORDER_DEFAULT;
        }
        if (needsPopulate) populate();
    }
}

我还必须将所有 PageTransformer 更改为 ViewPager.PageTransformer。然后像这样在自定义 PageTransformer 中进行转换,

if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){
    // > 11 version
    view.setAlpha(0);
}
else
{
    // Nine Old Androids version
    ViewHelper.setAlpha(view, 0);
 }

也可以使用 Ithink 代理,因此您不必编写版本检查。这甚至适用于 2.2

于 2013-07-11T13:35:31.443 回答