iT邦幫忙

2021 iThome 鐵人賽

DAY 19
0
Mobile Development

android studio 30天學習筆記系列 第 19

30天學習筆記 -day 19-viewpager動畫(PageTransformer )

一般的ViewPager在做滑動的過程中總是會覺得少了點流暢感,今天會使用PageTransformer實作ViewPager切換動畫。
今天的頁面會使用昨天的頁面。

PageTransformer介紹

PageTransformer是ViewPager内部定義的接口,應用於控制ViewPager中頁面的滑動,其接口提供一種方法transformPage(),該方法會在頁面切換(從a頁面轉到b頁面)時調用。

@Override
    public void transformPage(@NonNull View page, float position) {
    }

參數View是指頁面,參數position是指獲取頁面上的位置,根據該位置確定頁面轉換方向,它是一個動態屬性,會隨著viewpager滑動頁面產生變化。

https://ithelp.ithome.com.tw/upload/images/20210914/20138966ZKxRPvcqbv.png
-1的位置是先前的頁面,0的位置是當前的頁面,1的位置是下一個的頁面

當viewpager滑動頁面時參數position的變化,如下圖: -1 ->-1.5, 0 ->-0.5, 1 ->0.5
https://ithelp.ithome.com.tw/upload/images/20210914/201389669lpDuAs7vb.png
在這過程中就可以設置動畫。

viewpager動畫

目前官網上已經有 ZoomOutPageTransformer 跟 DepthPageTransformer 兩種不同viewpager轉換頁面的動畫,都是可以用的,那我就不放了~。
官網網址
想要使用viewpager的動畫,程式如下:

final ViewPager viewPager=(ViewPager)findViewById(R.id.viewpager);
viewPager.setPageTransformer(true,new ZoomOutPageTransformer());

自定義動畫

先建立MyPageTransformer.class,程式如下:

public class MyPageTransformer implements ViewPager.PageTransformer {
    private static final float MIN_SCALE = 0.9f;
    private static final float ROT_MAX = 10.0f;
        private float mRotAngle;
    @Override
    public void transformPage(@NonNull View page, float position) {

        if (position < -1) {  // [-Infinity,-1) 左邊滑到底
            page.setRotation(0);

        } else if (position <= 1) { // [-1,1] fragment1~fragment3之間滑動的動畫
            float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));

            if (position < 0) {//向左滑動
                mRotAngle = (ROT_MAX * position);
                page.setPivotX(page.getMeasuredWidth() * 0.5f);
                page.setPivotY(page.getMeasuredHeight());
                page.setRotation(mRotAngle);
                
                page.setScaleX(scaleFactor);
                page.setScaleY(scaleFactor);
            } else { //向右滑動
                mRotAngle = (ROT_MAX * position);
                page.setPivotX(page.getMeasuredWidth() * 0.5f);
                page.setPivotY(page.getMeasuredHeight());
                page.setRotation(mRotAngle);
                
                page.setScaleX(scaleFactor);
                page.setScaleY(scaleFactor);
            }

        } else { // (1, Infinity] 右邊滑到底
            page.setRotation(0);
        }
    }
}

成圖:

參考資料:https://codertw.com/android-%E9%96%8B%E7%99%BC/349083/


上一篇
android studio 30天學習筆記-day 18-viewPager
下一篇
android studio 30天學習筆記-day 20-SQLlite
系列文
android studio 30天學習筆記30

尚未有邦友留言

立即登入留言