經過它咱們能夠給圖片增長組合動畫效果,也能夠寫成一個圖片查看器。android
好比咱們首次安裝應用的時候,不少就會用到ViewPager給咱們作一個應用簡介。今天要寫的也是這個--怎麼用ViewPager實現動畫切換效果。git
1.經過谷歌提供給咱們的樣例代碼實現切換效果,由於咱們進不了谷歌的官方api,因此我直接貼出代碼github
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] // Use the default slide transition when moving to the left page view.setAlpha(1); view.setTranslationX(0); view.setScaleX(1); view.setScaleY(1); } else if (position <= 1) { // (0,1] // Fade the page out. 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); }
}
}
使用方法:api
mViewPager = (ViewPager) findViewById(R.id.viewPager); //爲ViewPager添加動畫效果 mViewPager.setPageTransformer(true,new DepthPageTransformer());
這裏提供的是切換頁面是透明度逐漸變化的效果,可是這種方法只支持android3.0以上的版本。由於是有api11以上才加入了屬性動畫。
若是須要兼容安卓3.0如下,須要加入一個jar包:JazzyViewPager第三方開源項目。能夠去github搜索下載。後面我會把下載資源地址加上ide
或者把ViewPager類的所有內容考到本身的方法中(ViewPagerCompat),註釋掉判斷api版本的代碼,而後引用此包而非引用ViewPager也能夠解決兼容問題。學習
最後,自定義ViewPager。動畫
經過分析谷歌給咱們的樣例代碼,咱們知道實現動畫效果實際上就是值(float)之間的變化,而在自己ViewPager方法中position,offset,offsetPixels是經過頁面滑動不斷變化的。因此咱們能夠經過活用這三個參數實現動畫切換效果。spa
public class MyViewPager extends ViewPager { private View mLeft; private View mRight; private float mTrans; private float mScale; private static final float MIN_SCALE = 0.5f; //經過map集合保存動畫和視圖 private Map<Integer, View> mChildren = new HashMap<Integer, View>(); public void setViewForPosition(View view, int position) { mChildren.put(position, view); //設置 //加入這個方法須要在main的 instantiateItem中註冊聲明,集體代碼以下 // mViewPager.setViewForPosition(mImageView, position); } public void removeViewFromPosition(Integer position) { mChildren.remove(position); //移除 //加入這個方法須要在main的 destroyItem中註冊使用,集體代碼以下 //mViewPager.removeViewFromPosition(position); } public MyViewPager(Context context) { super(context); } @Override protected void onPageScrolled(int position, float offset, int offsetPixels) { //得到當前的left和right的圖片 position爲0/1/2/3的整數值 mLeft = mChildren.get(position); mRight = mChildren.get(position+1); animStatck(mLeft, mRight, offset, offsetPixels); super.onPageScrolled(position, offset, offsetPixels); } private void animStatck(View left, View right, float offset, int offsetPixels) { //當右邊的圖片所有滑動至徹底顯示時 if (right != null) { //從第A頁到第B頁 offset0~1 mScale = (1 - MIN_SCALE) * offset + MIN_SCALE; mTrans = -getWidth() - getPageMargin() + offsetPixels; if(offset==0){//若是不置爲0,會在滑動時出現下一個頁面的圖片 mTrans = 0; mScale = 0; } //Viewhelper爲第三方jar報提供的方法,使用這個第三方jar包也能夠解決兼容性問題 ViewHelper.setScaleX(right,mScale); ViewHelper.setScaleX(right,mScale); ViewHelper.setTranslationX(right, mTrans); ViewHelper.setAlpha(right,offset); } if(left!=null){ left.bringToFront(); ViewHelper.setAlpha(right, offset); } } public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); } }須要注意的是,安卓3.0以上給咱們提供了
mViewPager.setPageTransformer(true,new DepthPageTransformer());方法設置動畫,其中第二個參數爲定義的動畫效果類。
學習Viewpager我麼須要注意的是或用第三方類,固然若是你自我要求比較高,能夠嘗試實現自動義的Viewpager動畫。自定義Viewpager動畫中,須要參考第三方jar的代碼,經過你想要的動畫,須要什麼屬性着手,活用其中的變量orm