自定義ViewPager的兼容性問題及解決辦法

經過它咱們能夠給圖片增長組合動畫效果,也能夠寫成一個圖片查看器。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) {
        //得到當前的leftright的圖片 position0/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

相關文章
相關標籤/搜索