【问题标题】:ViewPager PageTransformer (turn pages as a book)ViewPager PageTransformer(将页面作为一本书翻页)
【发布时间】:2017-03-07 16:53:58
【问题描述】:

我正在尝试在我的 ViewPager 上实现转换。 我想添加一个动画,就像我翻书一样,但很简单。 我看到一些关于 curl-animation 的帖子等等,但我不需要这样的东西。

有人可以帮我实现吗?

【问题讨论】:

    标签: android-viewpager android-pagetransformer


    【解决方案1】:

    您利用这个库https://github.com/moritz-wundke/android-page-curl 来实现所需的动画。

    【讨论】:

      【解决方案2】:

      我已经创建了这个 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);
              }
          }
      }
      

      希望对你有帮助。

      【讨论】:

      • 谢谢,但不幸的是它不起作用(页面只是通过点击更改而没有效果)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多