1

ViewPager で項目をアニメーション化しようとしていますが、PageTransformer はその条件に適合します。Android 2.2 との下位互換性を持たせたいので、サポート v4 ライブラリを使用しています。でも...

プロパティ アニメーションは Android 3.0 以降でのみサポートされているため、以前のプラットフォーム バージョンの ViewPager で PageTransformer を設定しても無視されます。

そのため、PageTransformer は古いバージョンでは動作しません

私はJake Wharton の NineOldAndroidsライブラリを使用しているので、その API を使用できますが、ViewPager のアニメーションを行う方法がわかりません。

どうすればこれを行うことができますか?

4

2 に答える 2

8

ビューに変換プロパティを設定するには、ラッパーをPageTransformer使用して実装する必要があります。AnimatorProxy

次に難しいのは、が下位の API バージョンViewPagerを無視することです。したがって、を使用するには、 自体PageTransformerを変更する必要があります。ViewPagerPageTransformer

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 に変更する必要がありました。次に、このようにカスタム PageTranformer で変換を行いました。

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

プロキシも使える​​と思いますのでバージョンチェックを書かなくても大丈夫です。これは2.2でも動きました。

于 2013-07-11T13:35:31.443 に答える