Android ViewPager不同页面的不同转换

Android ViewPager不同页面的不同转换,android,android-viewpager,android-animation,android-transitions,Android,Android Viewpager,Android Animation,Android Transitions,是否可以为ViewPager中的不同片段设置不同的页面转换器 当用户使用n个片段在ViewPager的(0,1)和(n-1,n)片段之间滑动时,我希望使用ZoomoutPagetTransformer,并对所有其他情况使用默认转换 我尝试的是: 使用mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener(){…})检测当前页面并在此处应用不同的转换。但是,例如,如果用户位于第一页-如何仅在他将向左滑动(0页)并在

是否可以为ViewPager中的不同片段设置不同的页面转换器

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

我尝试的是:


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

尽管使用了mViewPager.setOnPageChangeListener,但带有不同动画的单页转换器也会有所帮助

看看这里的第一段


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

我做了以下工作:

  • 已应用
    viewPager.setPageTransformer(true,新的DepthPageTransformer())用于所有页面
  • 单击后,我将其更改为
    viewPager.setPageTransformer(true,新的VerticalPageTransformer())。现在,为了使它能够顺利运行,我必须使用
    处理程序
    ,以便稍后更改页面以确保VerticalPager生效。我通过调用
    viewPager.setCurrentPosition(viewPager.getCurrentItem()+1)
  • 在此之后,我将onPageChangeListener的onPageSelected方法更改回
    viewPager.setPageTransformer(true,new DepthPageTransformer())处理程序中执行code>,以确保在垂直动画完成后完成
  • 注意-我还访问了ViewPager的滚动条,以实现上述功能,从而定义我自己的页面更改速度


    让我知道这是否有意义,因为你需要它做的基础上的页码。如果有,我将分享我的代码。:)

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

    第1步:

    创建自定义的
    ViewPager
    ,它从
    ViewPager
    扩展而来

    第二步:

    确定哪些
    Fragment
    位置(
    ViewPager
    page integers)需要具有唯一的
    PageTransformer
    。然后将这些索引添加到自定义
    ViewPager
    中的列表中

    第三步:

    覆盖已滚动页面上的
    (整数位置、浮点偏移、整数偏移像素)

    • 检查
      位置
      是否在索引列表中,如果是,则必须创建自定义对象;然后使用
      ViewPager
      更改页面转换
    • 对于其他位置,则必须设置默认的
      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);
        }
    }
    
    公共类CustomViewPager扩展了ViewPager{
    公共CustomViewPager(上下文){
    超级(上下文);
    }
    公共CustomViewPager(上下文、属性集属性){
    超级(上下文,attrs);
    }
    PageTransformer mDepthPageTransformer=新的PageTransformer(){
    专用静态最终浮动最小刻度=0.75f;
    公共页面(@NonNull视图,浮动位置){
    int pageWidth=view.getWidth();
    if(位置<-1){/[-无穷大,-1)
    //这个页面在屏幕的左边。
    视图。setAlpha(0f);
    
    }否则如果(位置可能与我现在做的相同-对不同的页面应用不同的
    PageTransformer
    ,检测当前显示的页面?或者想法是检测自定义
    PageTransformer
    中的当前页面?非常感谢您的回答。我这里的主要问题是在滚动期间切换到不同的动画模式那么如何硬编码-如果我们现在在第1页-如果用户向右滚动(第2+页)-我们应该显示默认动画,但是如果在左侧(回到第0页)-显示ZoomoutPagetTransformer one?