最近做一个类似图片游览器的功能,用ImageSwitch倒是可以,只要设置in 和 out 的动画就能做出类似左右滑动的效果,但是却没有ViewPager那种切换图片的效果好,而且用TouchListener监听左右滑动又不是很灵敏,所以选择ViewPager来实现左右滑动切换图片的效果.但是开始做的时候用平常的写法会出现内存溢出的情况,所以做了一些优化.
主要是用到了BitmapFactory压缩图片和没有用的图片进行回收.试过了切换100张图片也不会出现内存溢出的状况.
第一步:在xml中定义VIewPager
<android.support.v4.view.ViewPager
android:id="@+id/picture_vp"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</android.support.v4.view.ViewPager>
第二步:在代码中设置适配器
mPicture_vp = (ViewPager) view.findViewById(R.id.picture_vp);
List<View> list=new ArrayList<View>();
list.add(getActivity().getLayoutInflater().inflate(R.layout.picture_item1,null));
list.add(getActivity().getLayoutInflater().inflate(R.layout.picture_item2,null));
list.add(getActivity().getLayoutInflater().inflate(R.layout.picture_item3,null));
mPicture_vp .setAdapter(new PictureAdapter(list,getActivity()));
第三步:定义适配器,继承PagerAdapter
public class PictureAdapter extends PagerAdapter{
private List<View> mlist;
private Context c;
public PictureAdapter(List<View> v,Context context) {
mlist=v;
this.c=context;
}
@Override
public int getCount() {
if (mlist==null) {
return 0;
}
return mlist.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
@SuppressLint("NewApi")
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
BitmapDrawable gatLayoutbd=(BitmapDrawable)((ImageView)mlist.get(position).findViewById(R.id.picture_image)).getBackground();
((ImageView)mlist.get(position).findViewById(R.id.picture_image)).setBackground(null);//设置成null使之前的背景图片可以回收,释放内存
if (gatLayoutbd!=null && gatLayoutbd instanceof BitmapDrawable) {
if (gatLayoutbd.getBitmap()!=null && !gatLayoutbd.getBitmap().isRecycled()) {
gatLayoutbd.getBitmap().recycle();//回收图片,释放内存
}
}
container.removeView(mlist.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView iv=(ImageView) mlist.get(position).findViewById(R.id.picture_image);
BitmapFactory.Options opts=new BitmapFactory.Options();//图片工厂
opts.inSampleSize=2;//优化图片 使显示图片的大小为原图的一半,但是清晰度也会按比例下降
switch (position) {
case 0:
iv.setBackground(new BitmapDrawable(BitmapFactory.decodeResource(c.getResources(),R.drawable.pic1, opts)));
break;
case 1:
iv.setBackground(new BitmapDrawable(BitmapFactory.decodeResource(c.getResources(),R.drawable.pic2, opts)));
break;
case 2:
iv.setBackground(new BitmapDrawable(BitmapFactory.decodeResource(c.getResources(),R.drawable.pic3, opts)));
break;
}
container.addView(mlist.get(position));
return mlist.get(position);
}
}
在测试时发现 在Android原生系统上是没有问题的,但在华为EMUI系统上还会出现内存溢出的情况,大牛们如果知道望告知.
2016、10、20
问题解决了 用了imageload后在华为系统也能正常运行 而且可以不用压缩图片(压缩图片会降低清晰度)
在网上下载universal-image-loader-1.9.4-with-sources.jar
this.mImageLoader = ImageLoader.getInstance(); 初始化
mImageLoader.displayImage("drawable://" + list_imageid.get(position), iv);这句加在上面代码opts.inSampleSize=2;后面就可以了