查看大图这种需求在很多地方都用的到,而且产品说了,要可以缩放,要可以滑动哦。
然后就轮到技术人员来实现了。
首先,viewpager是必备的,其次放大图片photoView,然后就是嵌套来编写了。
class ImagePagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return imageList.size();
}
@Override
public View instantiateItem(ViewGroup container, int position) {
PhotoView photoView = new PhotoView(container.getContext());
imageLoader.displayImage(imageList.get(position), photoView, options);
// Now just add PhotoView to ViewPager and return it
container.addView(photoView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
return photoView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
这样就可以完成了一个滑动的查看大图的功能,很简单,但是还是有坑的。
问题以及解决方案:
一、关于图片缩放的photoView第三方
使用方法:
compile 'com.github.chrisbanes:PhotoView:1.3.0'
但是官方给出一个坑,会出现一个缩放的坑,异常是类型转换。
java.lang.IllegalArgumentException: pointerIndex out of range
其实原因就是缩放太小,超出范围了,解决方法就是重写ViewPager的onInterceptTouchEvent事件就OK了/** * Author:Shaojian * DATA:16/6/8. * ACTION:防止图片缩放时候产生的异常 * TYPE:重写ViewPager */ public class SlideViewPager extends ViewPager { public SlideViewPager(Context context) { super(context); } public SlideViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { try { return super.onInterceptTouchEvent(ev); } catch (IllegalArgumentException e) { e.printStackTrace(); return false; } } }
二、图片过大,手机内存过小会产生oom异常
说白了,就是内存溢出了,图片加载张数过多或者单张图片过大都会造成这个问题的发生。
解决方案1:可以在Androidmanifest里Application添加一个属性android:largeHeap="true"
这样可以给App申请出更多的内存来,但是这样也是治标不治本。
解决方案2:就是释放出不用的图片资源。class ImagePagerAdapter extends PagerAdapter { @Override public int getCount() { return imageList.size(); } @Override public View instantiateItem(ViewGroup container, int position) { PhotoView photoView = new PhotoView(container.getContext()); imageLoader.displayImage(imageList.get(position), photoView, options); // Now just add PhotoView to ViewPager and return it container.addView(photoView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); return photoView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); if (object instanceof PhotoView) { PhotoView s = (PhotoView)object; BitmapDrawable bitmapDrawable = (BitmapDrawable) s.getDrawable(); if (bitmapDrawable != null) { Bitmap bm = bitmapDrawable.getBitmap(); if (bm!=null && !bm.isRecycled()) { s.setImageResource(0); bm.recycle(); } } } } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } }
其实就是释放不用的图片资源。
ps:释放图片资源会产生一个bug(设置默认加载图片时候)
这样还会产生一个问题,就是如果是使用imageLoader加载图片的,会设置一个option,
options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.common_loading) .showImageForEmptyUri(R.drawable.common_loading) .showImageOnFail(R.drawable.common_loading) .cacheInMemory(true).cacheOnDisk(true).considerExifParams(true) .build();
加入你这时候没网或者其他的问题,造成图片记载不出来,就会产生这样的一个问题
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@17947547
这个问题是说想要使用一个已经释放的图片资源,说白了,你每页加载使用的都是common_loading这张图片,
但是你在滑到第三张时候已经释放了该资源,所以会造成该异常。
解决很简单,就是如下这样就ok了,至于想要加载图片或者其他的方法,后续继续更新。
options = new DisplayImageOptions.Builder() .cacheInMemory(true).cacheOnDisk(true).considerExifParams(true) .build();
如果您有其他的坑,也请分享给我吧,jsmeli@163.com