android - 用于处理 "centered"页面的 PageTransformer

标签 android android-viewpager android-animation

我有一个显示 3 个不同页面的 ViewPager。我想使用 Google 示例中的 ZoomOutPageTransformer 为寻呼机设置动画:

public class ZoomOutPageTransformer implements ViewPager.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();
        int pageOffset = 1; //one page offset

        if (position < -1) { // [-Infinity,-2)
            // This page is way off-screen to the left.
            view.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) {
                view.setTranslationX(horzMargin - vertMargin / 2);
            } else {
                view.setTranslationX(-horzMargin + vertMargin / 2);
            }

            // Scale the page down (between MIN_SCALE and 1)
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);

            // Fade the page relative to its size.
            view.setAlpha(MIN_ALPHA +
                    (scaleFactor - MIN_SCALE) /
                    (1 - MIN_SCALE) * (1 - MIN_ALPHA));

        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.setAlpha(0);
        }
    }

我添加了变量“pageOffset”。我现在想要的是动画不是第一页,而是第二页(居中)。所以我必须将整个动画向右移动一步。然后居中的页面将比其他页面“更大”并且更可见。

但是我无法做到这一点。我试图将位置更改为 position+offset 但没有成功。我应该在此代码段中做什么才能获得我想要的结果?

编辑:我认为这行得通 - 但是,它行不通:

public void transformPage(View view, float position) {
  int pageWidth = view.getWidth();
  int pageHeight = view.getHeight();
  int pageOffset = 1; //one page offset

if (position < -1 - pageOffset) { // [-Infinity,-2)
    // This page is way off-screen to the left.
    view.setAlpha(0);

} else if (position - pageOffset <= 1) { // [-1,1]
    // Modify the default slide transition to shrink the page as well
    float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position - pageOffset));
    float vertMargin = pageHeight * (1 - scaleFactor) / 2;
    float horzMargin = pageWidth * (1 - scaleFactor) / 2;
    if (position - pageOffset < 0) {
        view.setTranslationX(horzMargin - vertMargin / 2);
    } else {
        view.setTranslationX(-horzMargin + vertMargin / 2);
    }

    // Scale the page down (between MIN_SCALE and 1)
    view.setScaleX(scaleFactor);
    view.setScaleY(scaleFactor);

    // Fade the page relative to its size.
    view.setAlpha(MIN_ALPHA +
            (scaleFactor - MIN_SCALE) /
            (1 - MIN_SCALE) * (1 - MIN_ALPHA));

} else { // (1,+Infinity]
    // This page is way off-screen to the right.
    view.setAlpha(0);
}

最佳答案

我不能完全确定您的 Intent ,因为 pageOffset 设置为 1 并且从未更新过。也就是说,也许对我对 PageTransformer 的理解的解释会有所启发:

   if (mPageTransformer != null) {
        final int scrollX = getScrollX();
        final int childCount = getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = getChildAt(i);
            final LayoutParams lp = (LayoutParams) child.getLayoutParams();

            if (lp.isDecor) continue;

            final float transformPos = (float) (child.getLeft() - scrollX) / getClientWidth();
            mPageTransformer.transformPage(child, transformPos);
        }
    }

这是取自 ViewPageronPageScrolled 方法的 fragment .在 transformPage 方法中,您应该使用 position 参数来确定要应用的动画,如提供的 ZoomOutPageTransformer 所示:

if (position < -1) // This view is leftward beyond visibility.
else if (position <= 1) // This is our center view being scrolled into visibility.
else // This view is rightward beyond visibility.

再举个例子:

    @Override
    public void transformPage(View page, float position) {
        if (position >= 0) {
            page.setAlpha(Math.abs(Math.abs(position) - 1));
        }
    }

根据情况,此方法最多可能会被调用 3 次。让我们看一下我们有三个 View 并从最左边 (0) 滚动到中间 (1) 的情况。如果我们在转换过程中进行到一半,Math.abs(Math.abs(position) - 1) 两个 View 的值为 0.5 ||±0.5| - 1| = 0.5。这样,我们将对两个 View 应用 50% 的不透明度。

关于android - 用于处理 "centered"页面的 PageTransformer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20962245/

相关文章:

java - Android 将数组列表传递回父 Activity

安卓。在 fragment 中旋转动画

Android Layout Animations from bottom to top and top to bottom on ImageView click

Android:替换 View 寻呼机中的 fragment

android - 仅在我的 viewpager 的第一页中显示进度条

android - 如何在 ListView 中使用viewpager?

android - 单击图标时如何禁用底部导航 View 中的动画?

java - Android: launchMode=SingleTask 问题

android - Android Market 描述中的超链接

java - 单击 Firebase 通知时打开 MainActivity 以外的其他 Activity