0

是否可以为 ViewPager 中的不同片段设置不同的 PageTransformer?

当用户在具有 n 个片段的 ViewPager 的 (0, 1) 和 (n-1, n) 片段之间滑动时,我想使用 ZoomOutPageTransformer,并在所有其他情况下使用默认转换。

我尝试了什么:

检测当前页面mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { ... })并在此处应用不同的转换。但是,例如,如果用户在第一页上 - 如何设置 ZoomOutPageTransformer 仅用于他将向左滑动(0 页)并在动画开始之前执行此操作的情况?

4

3 回答 3

1

我有一个不太相似的要求,默认情况下我已将深度页面转换器应用于我的所有页面,然后点击按钮将其更改为垂直页面转换器,然后返回深度页面。(有点奇怪,但就是这样)

我做了以下事情:

  1. 适用viewPager.setPageTransformer(true, new DepthPageTransformer());于所有页面。
  2. onClick 我将其更改为viewPager.setPageTransformer(true, new VerticalPageTransformer());. 现在这是为了让它顺利运行,我不得不使用 ahandler以便稍后更改页面以确保 VerticalPager 生效。我通过调用实现了这一点viewPager.setCurrentPosition(viewPager.getCurrentItem() + 1)
  3. 在 onPageChangeListener 的 onPageSelected 方法内部之后,我将其更改回viewPager.setPageTransformer(true, new DepthPageTransformer());内部,handler以确保在我的垂直动画完成后完成。

注意 - 我还访问了 ViewPager 的滚动条来实现上述目的,以定义我自己的页面更改速度。

让我知道这是否有意义,因为您需要根据页码来完成。如果是这样,我将分享我的代码。:)

于 2014-12-01T12:05:55.680 回答
1

这已经很老了,但希望对某人来说还为时不晚

步骤1:

创建ViewPagerViewPager.

第2步:

确定哪些Fragment位置(ViewPager页面整数)需要PageTransformer为它们设置唯一性。然后将这些索引添加到 custom 中的列表中ViewPager

第 3 步:

覆盖onPageScrolled(int position, float offset, int offsetPixels)

  • 检查是否position在您的索引列表中,如果是,那么您必须创建一个自定义PageTransformer对象;然后利用ViewPager setPageTransformer()改变页面转换。
  • 对于除此之外的位置,您必须设置默认值PageTransformer(或者如果您愿意,您也可以使用另一个自定义PageTransformer对象。

代码

public class CustomViewPager extends ViewPager {

    public CustomViewPager(Context context) {
        super(context);
    }

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


    PageTransformer mDepthPageTransformer = new PageTransformer() {
        private static final float MIN_SCALE = 0.75f;

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

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

            } else if (position <= 0) { // [-1,0]
                // Use the default slide transition when moving to the left page
                view.setAlpha(1f);
                view.setTranslationX(0f);
                view.setScaleX(1f);
                view.setScaleY(1f);

            } else if (position <= 1) { // (0,1]
                // Fade the page out.
                view.setAlpha(1 - position);

                // Counteract the default slide transition
                view.setTranslationX(pageWidth * -position);

                // Scale the page down (between MIN_SCALE and 1)
                float scaleFactor = MIN_SCALE
                        + (1 - MIN_SCALE) * (1 - Math.abs(position));
                view.setScaleX(scaleFactor);
                view.setScaleY(scaleFactor);

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

    PageTransformer mDefaultPageTransformer = new PageTransformer() {
        @Override
        public void transformPage(@NonNull View page, float position) {
        }
    };


    @Override
    protected void onPageScrolled(int position, float offset, int offsetPixels) {

        List<Integer> pos = new ArrayList<>();
        pos.add(0);
        pos.add(n - 1); // n is the no. of pages as in the question

        if (pos.contains(position)) {
            this.setPageTransformer(true, mDepthPageTransformer);

        } else {
            this.setPageTransformer(true, mDefaultPageTransformer);
        }

        super.onPageScrolled(position, offset, offsetPixels);
    }
}

文档

注意:我的示例中使用的 mDepthPageTransformer 取自上述文档。

于 2019-10-03T18:35:46.667 回答
0

尽管使用mViewPager.setOnPageChangeListener,但具有不同动画的单个PageTransformer 可以提供帮助。

看看这里的第一段,

http://developer.android.com/training/animation/screen-slide.html#pagetransformer

于 2014-12-01T11:48:42.873 回答