ViewPager
- ViewPager
- 使用Field修改ViewPager的Scroller
- 使用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);