自定义ViewPager.PageTransformer实现幻灯片效果

           最近需要做幻灯片效果,仔细想想其实就是viewpage的自动切换而已,于是想到了viewpager.pagertransformer来实现,使用方法很简单,网上也一大把,这里不做记录,仅仅记录下自己用到的自定义pagertransfomer,以后如果用到可以直接用。

1.旋转动画

public class RotateDownPageTransformer implements ViewPager.PageTransformer {
    private static final float ROT_MAX = 360.0f;
    private float mRot;


    public void transformPage(View view, float position) {
        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.setRotation(0);

        } else if (position <= 1) // a页滑动至b页 ; a页从 0.0 ~ -1 ;b页从1 ~ 0.0
        { // [-1,1]
            // Modify the default slide transition to shrink the page as well
            if (position < 0) {

                mRot = (ROT_MAX * position);
                view.setPivotX(view.getMeasuredWidth() * 0.5f);
                view.setPivotY(view.getMeasuredHeight() * 0.5f);
                view.setRotation(mRot);
                view.setAlpha(1 + position);
                view.setTranslationX(-view.getWidth()*position);
            } else {
                view.setAlpha(1 - position);
                view.setTranslationX(-view.getWidth()*position);
                mRot = (ROT_MAX * position);
                view.setPivotX(view.getMeasuredWidth() * 0.5f);
                view.setPivotY(view.getMeasuredHeight() * 0.5f);
                view.setRotation(mRot);
            }

            // Scale the page down (between MIN_SCALE and 1)

            // Fade the page relative to its size.

        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.setRotation(0);
        }
    }
2.官方的缩放隐藏效果

public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
    private static final float MIN_SCALE = 0.85f;
    private static final float MIN_ALPHA = 0.5f;

    @SuppressLint("NewApi")
    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();
        int pageHeight = view.getHeight();


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

        } else if (position <= 1) { //a页滑动至b页 ; a页从 0.0 -1 ;b页从1 ~ 0.0
            // [-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);
        }
    }

3.延着Y轴进行旋转(可以自己修改成X轴)

public class RotateCenterYPagerTransformer implements ViewPager.PageTransformer {
    private static final int MAX_ROTATE = 180;

    @Override
    public void transformPage(View view, float position) {
        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.setAlpha(0);
        } else if (position <= 0) { // [-1,0]  控制左边view的   静止时他就是当前view
            if (position < -0.5) {
                view.setAlpha(0);
            } else {
                view.setAlpha(1);
            }
            if (position == 0) {
                view.setRotationY(0);
            } else {
                view.setRotationY(MAX_ROTATE * position);
            }
            view.setTranslationX(-view.getWidth() * position);
        } else if (position <= 1) { // (0,1]   1---0.5不出现
            if (position >= 0.5) {
                view.setTranslationX(view.getWidth() * position);
                view.setAlpha(0);
            } else {
                view.setTranslationX(-view.getWidth() * position);
                view.setAlpha(1);
            }
            view.setRotationY(MAX_ROTATE * position);
        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.setAlpha(0);
        }
    }
}

4.立体空间旋转缩放

public class DepthScaleRotatePagerTransformer implements ViewPager.PageTransformer {
    private static final int MAX_ROTATE = 180;

    @Override
    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();
        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.setAlpha(0);
        } else if (position <= 0) { // [-1,0]  控制左边view的   静止时他就是当前view
            // Use the default slide transition when moving to the left page
            view.setRotationY(MAX_ROTATE * position);
            view.setPivotX(pageWidth / 2);
            view.setPivotY(view.getHeight() / 2);
            if (position > -0.5) {
                view.setTranslationX(0);
                view.setScaleX(1 + position);
                view.setScaleY(1 + position);
                view.setAlpha(1 + position);
            } else if (position == -1.0) {
                view.setTranslationX(0);
                view.setScaleX(1);
                view.setScaleY(1);
                view.setAlpha(1);
            } else {
                view.setScaleX(-position - 0.3f);
                view.setScaleY(-position - 0.3f);
                view.setTranslationX(-pageWidth * (position + 0.5f) * 2);
                view.setAlpha(1 + position);
            }
        } else if (position <= 1) { // (0,1]
            view.setPivotX(pageWidth / 2);
            view.setPivotY(view.getHeight() / 2);
            view.setRotationY(MAX_ROTATE * position);
            if (position == 1.0f) {
                view.setTranslationX(0);
                view.setScaleX(1);
                view.setScaleY(1);
                view.setAlpha(1);
            } else if (position > 0.5) {//开始滑动
                view.setTranslationX(-pageWidth * (position - 0.5f) * 2);
                view.setScaleX(position - 0.3f);
                view.setScaleY(position - 0.3f);
                view.setAlpha(1 - position);
            } else {
                view.setTranslationX(0);
                view.setScaleX(1 - position);
                view.setScaleY(1 - position);
                view.setAlpha(1 - position);
            }
        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.setAlpha(0);
        }
    }
}

5.

public class DepthPageTransformer implements ViewPager.PageTransformer {
    private static final float MIN_SCALE = 0.75f;

    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();
        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.setAlpha(0);
        } else if (position <= 0) { // [-1,0]  控制左边view的   静止时他就是当前view
            // Use the default slide transition when moving to the left page
            view.setAlpha(1);
//            view.setTranslationX(pageWidth*position);
            view.setTranslationX(0);
            view.setScaleX(1);
            view.setScaleY(1);

        } else if (position <= 1) { // (0,1]
//            // Fade the page out.
//            Log.e("TAG", "transformPage: " + position);
            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(0);
        }
    }
}
6.改变透明度

public class AlphaChangeTransformer implements ViewPager.PageTransformer {
    @Override
    public void transformPage(View view, float position) {
        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.setAlpha(0);
        } else if (position <= 0) { // [-1,0]  控制左边view的   静止时他就是当前view
            view.setAlpha(1 + position);
            view.setTranslationX(-view.getWidth()*position);
        } else if (position <= 1) { // (0,1]
            view.setAlpha(1 - position);
            view.setTranslationX(-view.getWidth()*position);
        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.setAlpha(0);
        }
    }
}

7.

@TargetApi(18)
public class TransPageTransformer implements ViewPager.PageTransformer {
    @Override
    public void transformPage(View view, float position) {
        int width = view.getWidth();
        int height = view.getHeight();
        if (position < -1) { // [-Infinity,-1)
            view.setTranslationX(0);
        } else if (position <= 0) { // [-1,0]  控制左边view的   静止时他就是当前view
            if (position == -1.0f) {
                view.setTranslationX(0);
            } else {
                view.setTranslationX(-width * position);
                Rect rect = new Rect(0, 0, (int) (width * (1 + position)), height);
                view.setClipBounds(rect);
            }
        } else if (position <= 1) { // (0,1]
            if (position == 1.0f) {
                view.setTranslationX(0);
            } else {
                view.setTranslationX(-width * position);
                Rect rect = new Rect((int) (width * position), 0, width, height);
                view.setClipBounds(rect);
            }
        } else { // (1,+Infinity]
            view.setTranslationX(0);
        }
    }
}


另外记录一下改变自动轮播的速度的方法:

private void setViewPagerScrollSpeed(ViewPager viewPager, int speed) {
        try {
            Field field = ViewPager.class.getDeclaredField("mScroller");
            field.setAccessible(true);
            ViewPagerScroller viewPagerScroller = new ViewPagerScroller(viewPager.getContext(), new LinearInterpolator());
            field.set(viewPager, viewPagerScroller);
            viewPagerScroller.setDuration(speed);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
public class ViewPagerScroller extends Scroller {
    private int mDuration;

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

    public ViewPagerScroller(Context context, Interpolator interpolator) {
        super(context, interpolator);
    }

    public void setDuration(int mDuration) {
        this.mDuration = mDuration;
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy) {
        super.startScroll(startX, startY, dx, dy, this.mDuration);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        super.startScroll(startX, startY, dx, dy, this.mDuration);
    }

}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值