天天看點

ViewPager滑動動畫效果實作ViewPager滑動動畫效果

ViewPager滑動動畫效果

效果①:

ViewPager滑動動畫效果實作ViewPager滑動動畫效果

效果②:

ViewPager滑動動畫效果實作ViewPager滑動動畫效果

實作

建立布局檔案:fragment_screen_slide_page.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text"
        style="?android:textAppearanceMedium"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:lineSpacingMultiplier="1.2"
        android:padding="16dp"
        android:text="1"
        android:textColor="@android:color/white"
        android:textSize="40dp"
        android:textStyle="bold" />

</LinearLayout>
           

activity_screen_slide.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" />
           

建立ScreenSlideActivity.java

public class ScreenSlideActivity extends FragmentActivity {

    private static final int NUM_PAGES = ;

    private ViewPager mPager;

    private PagerAdapter mPagerAdapter;

    private static final int[] COLOR = {
            , , , , 
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_screen_slide);

        mPager = (ViewPager) findViewById(R.id.pager);
        mPager.setPageTransformer(true, new ZoomOutPageTransformer());//為ViewPager設定變換動畫
        mPagerAdapter = new ScreenSlidePagerAdapter(getFragmentManager());
        mPager.setAdapter(mPagerAdapter);
    }


    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return ScreenSlidePageFragment.create(position, COLOR[position % COLOR.length]);
        }

        @Override
        public int getCount() {
            return NUM_PAGES;
        }
    }
}
           

ScreenSlidePageFragment.java

public class ScreenSlidePageFragment extends Fragment {
    public static final String PAGE = "page";
    public static final String COLOR = "color";

    private int mPageNumber;
    private int mColor;

    public static ScreenSlidePageFragment create(int pageNumber, int color) {
        ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
        Bundle args = new Bundle();
        args.putInt(PAGE, pageNumber);
        args.putInt(COLOR, color);
        fragment.setArguments(args);
        return fragment;
    }

    public ScreenSlidePageFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPageNumber = getArguments().getInt(PAGE);
        mColor = getArguments().getInt(COLOR);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater
                .inflate(R.layout.fragment_screen_slide_page, container, false);
        rootView.setBackgroundColor(mColor);
        ((TextView) rootView.findViewById(R.id.text)).setText("" + mPageNumber);
        return rootView;
    }
}
           

動畫效果一的實作:

ZoomOutPageTransformer.java

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

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

        /**
         * position:這個position不是手指滑動的坐标位置,而是滑動頁面相對于手機螢幕的位置,
         * 範圍位:[-1,1],[-1,0)表示頁面向左滑出螢幕,0表示處于中心(即目前顯示)的頁面,
         * (0,1]表示頁面向右滑出螢幕
         */
        if (position < -) { //表示已經滑出螢幕(左邊)
            view.setAlpha();
        } else if (position <= ) { // [-1,1]
            float scaleFactor = Math.max(MIN_SCALE,  - Math.abs(position));
            float vertMargin = pageHeight * ( - scaleFactor) / ;
            float horzMargin = pageWidth * ( - scaleFactor) / ;
            if (position < ) {
                view.setTranslationX(horzMargin - vertMargin / );
            } else {
                view.setTranslationX(-horzMargin + vertMargin / );
            }

            //縮放
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);

            //設定透明度
            view.setAlpha(MIN_ALPHA +
                    (scaleFactor - MIN_SCALE) /
                            ( - MIN_SCALE) * ( - MIN_ALPHA));

        } else {
            //表示已經滑出螢幕(右邊)
            view.setAlpha();
        }
    }
}
           

動畫效果二的實作:

DepthPageTransformer.java

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

    @Override
    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();

        /**
         * position:這個position不是手指滑動的坐标位置,而是滑動頁面相對于手機螢幕的位置,
         * 範圍位:[-1,1],[-1,0)表示頁面向左滑出螢幕,0表示處于中心(即目前顯示)的頁面,
         * (0,1]表示頁面向右滑出螢幕
         */
        if (position < -) { //表示已經滑出螢幕(左邊)
            view.setAlpha();
        } else if (position <= ) { // [-1,0]
            view.setAlpha();
            view.setTranslationX();
            view.setScaleX();
            view.setScaleY();

        } else if (position <= ) { // (0,1]
            view.setAlpha( - position);

            view.setTranslationX(pageWidth * -position);

            float scaleFactor = MIN_SCALE
                    + ( - MIN_SCALE) * ( - Math.abs(position));
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);

        } else { //表示已經滑出螢幕(右邊)
            view.setAlpha();
        }
    }
}
           

應用動畫

調用ViewPager的如下方法應用動畫效果:

//為ViewPager設定變換動畫
setPageTransformer(true, new ZoomOutPageTransformer());
           

源碼:https://github.com/heqinghqocsh/Android_Animation