我們在使用ViewPager時,就是寫個Adapter,拿到數據,填充進去,OVER!
滑動時很平穩,與我們在用其它APP時看到的舒服的,流暢的滑動不同,它們都加了特效!
話不多說,直接上谷歌給的類 ZoomOutPageTransformer
還有官方文檔 谷歌文檔在此
使用很簡單 拿到ViewPager 在配置適配器之後“上特效即可”
initData();
vp_guid.setAdapter(new GuidAdapter());
vp_guid.setPageTransformer(true,new ZoomOutPageTransformer());
接下來看一下此類
public class ZoomOutPageTransformer implements ViewPager.PageTransformer{
private static final float MIN_SCALE = 0.85f;
private static final float MIN_ALPHA = 0.5f;
@Override
public void transformPage(View page, float position) {
int pageWidth = page.getWidth();
int pageHeight = page.getHeight(); //(1)引導頁左上角的點是 0 右上角是 1 所以纔有如下算法
if (position<-1){
page.setAlpha(0);
}else if (position<=1){ //(2)
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){
page.setTranslationX(horzMargin - vertMargin / 2);
}else {
page.setTranslationX(-horzMargin+vertMargin/2);
}
page.setScaleX(scaleFactor);
page.setScaleY(scaleFactor);
page.setAlpha(MIN_ALPHA+(scaleFactor - MIN_SCALE)/(1-MIN_SCALE)*(1-MIN_ALPHA));
}else {
page.setAlpha(0);
}
}
}
總結分析一下:算法較爲簡單,(1)處拿到滑動的位置
(2)是具體計算漸變動畫的邏輯
至於爲什麼
vertMargin / 2
是X軸的縮放,水平邊距要減去page垂直邊距的一半。看起來更合適??
之後就是向下漸變的邏輯了.
還有另外一點
如果你的ViewPager不可以回滾了,子View有容器了 不妨修改適配器如下
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
ImageView view = array_images.get(position);
container.removeView(view);
}
最後,這些總結希望對你有用!