2017-03-07 199 views
0

我試圖在ViewPager上實現一個轉換。 我想添加一個動畫,就像我翻過一本書的頁面一樣簡單。 我看到一些帖子與捲曲動畫和更多,但我不需要這樣的事情。ViewPager PageTransformer(翻頁成書)

有人可以幫助我實現它嗎?

回答

0

我創造了這個PageTransformer:

public class PageCurlTransformer extends BaseTransformer { 

    private final Matrix OFFSET_MATRIX = new Matrix(); 
    private final Camera OFFSET_CAMERA = new Camera(); 
    private final float[] OFFSET_TEMP_FLOAT = new float[2]; 

    public static final String TYPE_CURL_CENTERED = "CENTERD"; 
    public static final String TYPE_CURL_TOP = "TOP"; 
    public static final String TYPE_CURL_BOTTOM = "BOTTOM"; 

    private boolean mRotation; 
    private float mRotationCurlType = 0.5f; 

    public PageCurlTransformer(boolean rotation) { 
     mRotation = rotation; 
     mRotationCurlType = 0.5f; 
    } 

    public PageCurlTransformer(String curlType) { 
     mRotation = true; 

     if (curlType.equals(TYPE_CURL_CENTERED)) 
      mRotationCurlType = 0.5f; 
     else if (curlType.equals(TYPE_CURL_TOP)) 
      mRotationCurlType = 1.5f; 
     else if (curlType.equals(TYPE_CURL_BOTTOM)) 
      mRotationCurlType = -0.5f; 
    } 

    @Override 
    protected void onTransform(View view, float position) { 
     //view.setTranslationX(position < 0 ? 0f : -view.getWidth() * position); 

     if (position <= 0f) { 

      view.setPivotX(position < 0 ? 0 : view.getWidth()); 
      view.setScaleX(position < 0 ? 1f + position : 1f - position); 

      if (mRotation) { 
       final float rotation = (position < 0 ? 30f : -30f) * Math.abs(position); 

       view.setTranslationX(getOffsetXForRotation(rotation, view.getWidth(), view.getHeight())); 

       view.setPivotY(view.getHeight() * mRotationCurlType); 
       view.setRotationY(-rotation); 
      } 
     } else if (position <= 1f) { 
      view.setTranslationX(position < 0 ? 0f : -view.getWidth() * position); 
     } 
    } 

    protected final float getOffsetXForRotation(float degrees, int width, int height) { 
     OFFSET_MATRIX.reset(); 
     OFFSET_CAMERA.save(); 
     OFFSET_CAMERA.rotateY(Math.abs(degrees)); 
     OFFSET_CAMERA.getMatrix(OFFSET_MATRIX); 
     OFFSET_CAMERA.restore(); 

     OFFSET_MATRIX.preTranslate(-width * 0.5f, -height * 0.5f); 
     OFFSET_MATRIX.postTranslate(width * 0.5f, height * 0.5f); 
     OFFSET_TEMP_FLOAT[0] = width; 
     OFFSET_TEMP_FLOAT[1] = height; 
     OFFSET_MATRIX.mapPoints(OFFSET_TEMP_FLOAT); 
     return (width - OFFSET_TEMP_FLOAT[0]) * (degrees > 0.0f ? 1.0f : -1.0f); 
    } 
} 

其中BaseTransformer是:

public abstract class BaseTransformer implements PageTransformer { 

    protected abstract void onTransform(View view, float position); 

    @Override 
    public void transformPage(View view, float position) { 
     onPreTransform(view, position); 
     onTransform(view, position); 
    } 

    protected boolean hideOffscreenPages() { 
     return true; 
    } 

    protected boolean isPagingEnabled() { 
     return false; 
    } 

    protected void onPreTransform(View view, float position) { 
     final float width = view.getWidth(); 

     view.setRotationX(0); 
     view.setRotationY(0); 
     view.setRotation(0); 
     view.setScaleX(1); 
     view.setScaleY(1); 
     view.setPivotX(0); 
     view.setPivotY(0); 
     view.setTranslationY(0); 
     view.setTranslationX(isPagingEnabled() ? 0f : -width * position); 

     if (hideOffscreenPages()) { 
      view.setAlpha(position <= -1f || position >= 1f ? 0f : 1f); 
     } else { 
      view.setAlpha(1f); 
     } 
    } 
} 

我希望它可以幫助你。