package org.wordpress.android.widgets; import android.support.v4.view.ViewPager; import android.view.View; /* * ViewPager transformation animation invoked when a visible/attached page is scrolled - before * changing this, first see https://code.google.com/p/android/issues/detail?id=58918#c5 * tl;dr make sure to remove X translation when a page is no longer fully visible * * zoom & depth are based on examples here, with many fixes and simplifications: * http://developer.android.com/training/animation/screen-slide.html#pagetransformer */ public class WPViewPagerTransformer implements ViewPager.PageTransformer { public enum TransformType { FLOW, DEPTH, ZOOM, SLIDE_OVER } private final TransformType mTransformType; public WPViewPagerTransformer(TransformType transformType) { mTransformType = transformType; } private static final float MIN_SCALE_DEPTH = 0.75f; private static final float MIN_SCALE_ZOOM = 0.85f; private static final float MIN_ALPHA_ZOOM = 0.5f; private static final float SCALE_FACTOR_SLIDE = 0.85f; private static final float MIN_ALPHA_SLIDE = 0.35f; public void transformPage(View page, float position) { final float alpha; final float scale; final float translationX; switch (mTransformType) { case FLOW: page.setRotationY(position * -30f); return; case SLIDE_OVER: if (position < 0 && position > -1) { // this is the page to the left scale = Math.abs(Math.abs(position) - 1) * (1.0f - SCALE_FACTOR_SLIDE) + SCALE_FACTOR_SLIDE; alpha = Math.max(MIN_ALPHA_SLIDE, 1 - Math.abs(position)); int pageWidth = page.getWidth(); float translateValue = position * -pageWidth; if (translateValue > -pageWidth) { translationX = translateValue; } else { translationX = 0; } } else { alpha = 1; scale = 1; translationX = 0; } break; case DEPTH: if (position > 0 && position < 1) { // moving to the right alpha = (1 - position); scale = MIN_SCALE_DEPTH + (1 - MIN_SCALE_DEPTH) * (1 - Math.abs(position)); translationX = (page.getWidth() * -position); } else { // use default for all other cases alpha = 1; scale = 1; translationX = 0; } break; case ZOOM: if (position >= -1 && position <= 1) { scale = Math.max(MIN_SCALE_ZOOM, 1 - Math.abs(position)); alpha = MIN_ALPHA_ZOOM + (scale - MIN_SCALE_ZOOM) / (1 - MIN_SCALE_ZOOM) * (1 - MIN_ALPHA_ZOOM); float vMargin = page.getHeight() * (1 - scale) / 2; float hMargin = page.getWidth() * (1 - scale) / 2; if (position < 0) { translationX = (hMargin - vMargin / 2); } else { translationX = (-hMargin + vMargin / 2); } } else { alpha = 1; scale = 1; translationX = 0; } break; default: return; } page.setAlpha(alpha); page.setTranslationX(translationX); page.setScaleX(scale); page.setScaleY(scale); } }