【问题标题】:How to achieve a ViewPager with previous and next page shown and bigger focused page如何实现 ViewPager 显示上一页和下一页以及更大的焦点页面
【发布时间】:2014-08-22 04:26:13
【问题描述】:

我正在尝试创建一些可以在查看器上显示我的页面的东西,以使其具有良好的感觉和设计,我查看了这个link,它在某种程度上有所帮助,并遵循这个link,了解我如何实现它但我最终遇到了一些问题。首先,对于运行在 API11(API8 是我的目标)以下的设备,它不会真正起作用或看起来那么好。其次是我无法使焦点页面大于下一页和上一页。为了设计,我希望它看起来像这样:

希望有人可以帮助我实现这一目标或任何其他方式。

【问题讨论】:

  • 嗨@deniz,感谢您的评论,但不确定这是否是我需要的。请参阅我对以下答案的评论。谢谢!
  • 到目前为止尝试了第一个链接。它可以工作,但不能满足我需要的感觉,并且还缺少有关如何使用的文档。还锁定了进一步定制的可能性。继续下一个链接。

标签: android android-viewpager


【解决方案1】:

首先阅读this。然后应用您自己的PageTransformer 实现。像这样的:

public class DepthPageTransformer implements ViewPager.PageTransformer {
    private static final float MIN_SCALE = 0.5f;
    private static final float MAX_SCALE = 0.8f;
    private static final float MIN_FADE = 0.2f;

    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();

        if (position < -1) {
            view.setAlpha(MIN_FADE);
        } else if (position < 0) {
            view.setAlpha(1 + position * (1 - MIN_FADE));
            view.setTranslationX(-pageWidth * MAX_SCALE * position);
            ViewCompat.setTranslationZ(view, position);
            float scaleFactor = MIN_SCALE
                    + (MAX_SCALE - MIN_SCALE) * (1 - Math.abs(position));
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);
        } else if (position == 0) {
            view.setAlpha(1);
            view.setTranslationX(0);
            view.setScaleX(MAX_SCALE);
            ViewCompat.setTranslationZ(view, 0);
            view.setScaleY(MAX_SCALE);
        } else if (position <= 1) {
            ViewCompat.setTranslationZ(view, -position);
            view.setAlpha(1 - position * (1 - MIN_FADE));
            view.setTranslationX(pageWidth * MAX_SCALE * -position);

            float scaleFactor = MIN_SCALE
                    + (MAX_SCALE - MIN_SCALE) * (1 - Math.abs(position));
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);
        } else {
            view.setAlpha(MIN_FADE);
        }
    }
}

您还需要控制子绘图顺序以将当前选定的视图设置在顶部(仅当您的视图相互重叠时才需要):

public class MyPager extends ViewPager {
    public MyPager(Context context) {
        this(context, null);
    }

    public MyPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected int getChildDrawingOrder(int childCount, int i) {
        if(i == childCount - 1) {
            return getCurrentItem();
        } else {
            return i >= getCurrentItem()? i + 1 : i;
        }
    }
}

如果屏幕上有更多可见页面,请将 ViewPager.setOffscreenPageLimit 设置为 2 或更多。

结果如下:

【讨论】:

  • @artkoening 你能提供这段代码的完整示例吗?
  • 剩下的很明显:你需要一个带有 MyPager 和 PagerAdapter 的布局,仅此而已。
  • 谢谢,但我无法从中心获得翻译和缩放。它来自底部
  • 你知道如何为 ViewPager2 实现相同的功能吗?由于 ViewPager2 类是最终类,因此您无法覆盖 getChildDrawingOrder 方法。
猜你喜欢
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多