Android ViewPager针对不同页面的不同转换

时间:2014-12-01 10:24:52

标签: android android-viewpager android-animation android-transitions

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

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

我尝试了什么:

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

3 个答案:

答案 0 :(得分:1)

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

我做了以下事情:

  1. 已为所有网页应用viewPager.setPageTransformer(true, new DepthPageTransformer());
  2. onClick我将其更改为viewPager.setPageTransformer(true, new VerticalPageTransformer());。现在,为了顺利运行,我们必须使用handler以便稍后更改页面以确保VerticalPager生效。我通过致电viewPager.setCurrentPosition(viewPager.getCurrentItem() + 1)
  3. 来实现这一目标
  4. 在onPageChangeListener的onPageSelected方法内部后,我在viewPager.setPageTransformer(true, new DepthPageTransformer());内再次将其更改回handler,以确保在完成垂直动画后完成。
  5. 注意 - 我还访问了ViewPager的滚动条来实现上述目标,以便为页面更改定义自己的速度。

    如果这有意义,请告诉我,因为您需要根据页码来完成。如果有,我将分享我的代码。 :)

答案 1 :(得分:0)

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

请看这里的第一段,

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

答案 2 :(得分:0)

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

第1步:

创建自ViewPager开始的自定义ViewPager

第2步:

确定哪些Fragment位置(ViewPager页整数)需要具有唯一的PageTransformer。然后将这些索引添加到自定义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来自上述文档。