Обратная совместимость PageTransformer

Я пытаюсь анимировать элементы в ViewPager и PageTransformer отвечает всем требованиям. Я хочу, чтобы он был обратно совместим с Android 2.2, поэтому я использую библиотеку поддержки v4. Тем не мение...

Поскольку анимация свойств поддерживается только в Android 3.0 и более поздних версиях, настройка PageTransformer на> ViewPager в более ранних версиях платформы будет игнорироваться.

поэтому PageTransformer не будет работать на старых версиях

Я использую библиотеку Джейна Уортона NineOldAndroids, чтобы я мог использовать этот API, но я не уверен, как сделать анимацию для ViewPager.

Как я мог это сделать?

2 ответа

Вам необходимо реализовать PageTransformer с использованием AnimatorProxy обертка для установки свойств преобразования в представлениях.

Тогда самое сложное то, что ViewPager будет игнорировать PageTransformer в более низких версиях API. Так что вам нужно изменить ViewPager Сам использовать PageTransformer,

У меня есть раздвоенная версия библиотеки поддержки на GitHub, которая позволяет это, а также использование аниматоров NineOldAndroids для пользовательских переходов фрагментов. Используйте аниматор-переходную ветку. Это проект 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);
        }
    }
}

Как сказал @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);
 }

Можно также использовать прокси-сервер Ithink, так что вам не нужно писать проверку версии. Это работало даже для 2.2

Другие вопросы по тегам