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);