自定義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);
    }

}




發佈了62 篇原創文章 · 獲贊 28 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章