android android-viewpager android-animation nineoldandroids

android - Conversión hacia atrás de la página Transformer



android-viewpager android-animation (2)

Intento animar elementos en un ViewPager y el PageTransformer se ajusta a la ley. Quiero que sea compatible con Android 2.2, así que estoy usando la biblioteca de soporte v4. Sin embargo...

Como la animación de la propiedad solo se admite a partir de Android 3.0 y reenviar, se ignorará la configuración de un PageTransformer en un> ViewPager en las versiones de plataforma anteriores.

así que PageTransformer no funcionará en versiones anteriores

Estoy usando la biblioteca NineOldAndroids de Jake Wharton para poder usar esa API, pero no estoy seguro de cómo hacer la animación de un ViewPager.

¿Cómo podría hacer esto?


Como @mark.kedzierski dijo que copió la clase ViewPager desde aquí y eliminó la declaración if para la versión (verifique a continuación) y lo llamó 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(); } }

También tuve que cambiar todo PageTransformer a ViewPager.PageTransformer. Luego hicieron las transformaciones en un PageTranformer personalizado como este,

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

Ithink proxy también se puede usar para que no tenga que escribir la verificación de versión. Esto funcionó incluso para 2.2


PageTransformer implementar el PageTransformer utilizando el contenedor AnimatorProxy para establecer las propiedades de transformación en las vistas.

Entonces, la parte difícil es que ViewPager ignorará el PageTransformer en versiones de API más bajas. Por lo tanto, debe modificar el ViewPager para usar el PageTransformer .

Tengo una versión bifurcada de la biblioteca de soporte en GitHub que permite esto así como el uso de animadores NineOldAndroids para transiciones de fragmentos personalizados. Usa la rama de animación-transición. Es un proyecto de maven así que puedes construirlo desde el subdirectorio 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); } } }