ViewPager自帶了一種默認的頁面滑動切換動畫,但是如果產品想要更炫的滑動效果的時候怎麼辦呢?不要怕,我們可以使用support library的 PagerTransformer,API11 (Honeycomb) 及以上android版本都支持這個類。 用法很方便,
viewpager.setPageTransformer(false, new ViewPager.PageTransformer() {
@Override
public void transformPage(View page, float position) {
// do transformation here
}
});
transformPage(View page, float position)方法有兩個參數,page參數代表當前view 或 fragment,position參數就是它的位置的值。滑動的時候,起始page和目標page的各自的transformPage()就會被同時觸發調用。一個page的position爲0代表它處於中間,爲1代表它完全處於右邊,爲-1代表它完全處於左邊。
官方文檔是這樣說的,position是一個page相對於屏幕中心的位置。position的值跟隨用戶滑動page而變化。當page填充屏幕完全可見的時候,它的position是0;page位於屏幕右邊,它的position是1。兩個page同時滑動到一半的時候,左邊page的position是-0.5,右邊page的position是0.5。(因爲左右是對稱的)所以,爲了不考慮正負值,我們取position的絕對值:
final float normalizedposition = Math.abs(Math.abs(position) - 1);
現在左右兩個page各自有了一個0到1之間的normalizedposition值(左邊在遞減[1,0],右邊在遞增[0,1]),怎麼用就靠你了。比如,首先,我們可以做一個淡入淡出效果。
@Override
public void transformPage(View page, float position) {
final float normalizedposition = Math.abs(Math.abs(position) - 1);
page.setAlpha(normalizedposition);
}
尺寸大小變化效果:
@Override
public void transformPage(View page, float position) {
final float normalizedposition = Math.abs(Math.abs(position) - 1);
page.setScaleX(normalizedposition / 2 + 0.5f);
page.setScaleY(normalizedposition / 2 + 0.5f);
}
最後一個例子是使page沿Z軸方向旋轉30度:
@Override
public void transformPage(View page, float position) {
page.setRotationY(position * -30);
}
上面是一些簡單的例子,這裏官方給了兩個例子。也可以把PagerTransformer和PagerTitleStrip/ PagerTabStrip結合在一起。
原文 http://andraskindler.com/blog/2013/create-viewpager-transitions-a-pagertransformer-example/
young YoungPeanut.github.io
博客 http://youngpeanut.github.io/2016-01-17/android-viewpager-transform/