項目實戰-ViewPager

ViewPager

  1. ViewPager
  2. 使用Field修改ViewPager的Scroller
  3. 使用Volley加載網絡圖片並實現3級緩存

Field理論知識:JAVA反射系列之Field
Scroller理論知識: Android Scroller完全解析,關於Scroller你所需知道的一切
網絡通信框架-Volley: Android Volley完全解析(二),使用Volley加載網絡圖片
LruCache內存緩存:Android高效加載大圖、多圖解決方案,有效避免程序OOM

ViewPager

佈局使用ViewPager控件

<android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

匿名內部類繼承PagerAdapter

private PagerAdapter mPagerAdapter = new PagerAdapter() {
    @Override
    public int getCount() {
        return mViewList.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        BitmapView bitmapView = mViewList.get(position);
        ImageView iv = (ImageView) ViewPagerActivity.this.getLayoutInflater().inflate(R.layout.viewpager_show, mViewPager, false);
        getBitmap(iv, bitmapView.mUrl, bitmapView.mRes, bitmapView.mRes);
        container.addView(iv);
        return iv;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }
};

ViewPager設置Adapter

mViewPager = (ViewPager) findViewById(R.id.viewPager);
        mViewPager.setAdapter(mPagerAdapter);

加載View

private void loadView() {
    verifyStoragePermissions(this);
    mViewList.clear();

    for (int i = 0; i < 3; i++) {
        mViewList.add(new BitmapView(mRes[i], mUrl[i]));
    }
    mPagerAdapter.notifyDataSetChanged();
}

修改ViewPager的Scroller

繼承Scroller

import android.content.Context;
import android.view.animation.Interpolator;
import android.widget.Scroller;

/**
 * Created by silion on 2016/9/18.
 */
public class ViewPagerScroller extends Scroller {
    private static final int DURATION = 1000;

    public ViewPagerScroller(Context context) {
        super(context);
    }

    public ViewPagerScroller(Context context, Interpolator interpolator) {
        super(context, interpolator);
    }

    public ViewPagerScroller(Context context, Interpolator interpolator, boolean flywheel) {
        super(context, interpolator, flywheel);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        // Ignore received duration, use fixed one instead
        super.startScroll(startX, startY, dx, dy, DURATION);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy) {
        // Ignore received duration, use fixed one instead
        super.startScroll(startX, startY, dx, dy, DURATION);
    }
}

更改Scroller

protected void initViewPagerScroller() {
    try {
        Field scroller;
        scroller = ViewPager.class.getDeclaredField("mScroller");
        scroller.setAccessible(true);
        Field interpolator = ViewPager.class.getDeclaredField("sInterpolator");
        interpolator.setAccessible(true);
        ViewPagerScroller viewPagerScroller = new ViewPagerScroller(this, (Interpolator) interpolator.get(null));
        scroller.set(mHeaderViewPager, viewPagerScroller);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Volley加載網絡圖片

實現ImageCache接口

public class BitmapCache implements ImageLoader.ImageCache {
    private Context mContext;
    private String mCachePath;
    private LruCache<String, Bitmap> mCache;

    public BitmapCache(Context context) {
        mContext = context;
        mCachePath = mContext.getExternalCacheDir().getPath();
        int maxSize = 50 * 1024 * 1024;
        mCache = new LruCache<String, Bitmap>(maxSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                return bitmap.getRowBytes() * bitmap.getHeight();
            }
        };
    }

    @Override
    public Bitmap getBitmap(String url) {
        String fileName = MD5Utils.encode(url);
        Bitmap bitmap;

        // 從內存讀
        bitmap = mCache.get(fileName);

        // 從本地讀
        if (bitmap == null) {
            bitmap = getBitmapFromLocal(fileName);
        }

        return bitmap;
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        String fileName = MD5Utils.encode(url);

        // 緩存到內存
        mCache.put(fileName, bitmap);

        // 緩存到本地
        putBitmapToLocal(fileName, bitmap);
    }

    private void putBitmapToLocal(String fileName, Bitmap bitmap) {
        File file = new File(mCachePath, fileName);
        File parentFile = file.getParentFile();
        if (!parentFile.exists()) {
            parentFile.mkdirs();
        }

        try {
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(file));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    private Bitmap getBitmapFromLocal(String fileName) {
        File file = new File(mCachePath, fileName);
        if (file.exists()) {
            try {
                Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(file));
                return bitmap;
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }

        return null;
    }
}
mQueue = Volley.newRequestQueue(ViewPagerActivity.this);
mImageLoader = new ImageLoader(mQueue, new BitmapCache(this));
// 使用Volley加載網絡圖片
ImageLoader.ImageListener listener = ImageLoader.getImageListener(iv, defaultImg, errorImg);
mImageLoader.get(url, listener);
發佈了41 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章