gallery+imageSwitch控件载入图片的优化

原来的adapter的getview方法如下

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder = new ViewHolder();
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.item, null);
        viewHolder = new ViewHolder();
        viewHolder.imageView = (ImageView) convertView
                .findViewById(R.id.item_imageview);
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 2;
        Bitmap bitmap = BitmapFactory.decodeFile(
                imgPathlist.get(position % imgPathlist.size()), options);
        viewHolder.imageView.setImageBitmap(bitmap);// 为ImageView设置内容
        viewHolder.imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        viewHolder.imageView.setLayoutParams(new LinearLayout.LayoutParams(
                100, 100));
        viewHolder.imageView.setBackgroundResource(mGalleryItemBackground);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    return convertView;
}


class ViewHolder {
    ImageView imageView;
}


载入大量图片时候会内存溢出,错误提示:

12-10 17:49:21.393: E/AndroidRuntime(16350): FATAL EXCEPTION: main
12-10 17:49:21.393: E/AndroidRuntime(16350): java.lang.OutOfMemoryError
12-10 17:49:21.393: E/AndroidRuntime(16350):    at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
12-10 17:49:21.393: E/AndroidRuntime(16350):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:527)
12-10 17:49:21.393: E/AndroidRuntime(16350):    at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:301)
12-10 17:49:21.393: E/AndroidRuntime(16350):    at com.smalt.photoview.MyAdapter.getView(MyAdapter.java:110)

参考stackoverflow上修改如下:

@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder viewHolder = new ViewHolder();
		if (convertView == null) {
			// 无convertView,需要new出各个控件
			convertView = inflater.inflate(R.layout.item, null);
			viewHolder = new ViewHolder();
			viewHolder.imageView = (ImageView) convertView
					.findViewById(R.id.item_imageview);
			Bitmap bitmap = getBitmap(position, 20, 20);
			viewHolder.imageView.setImageBitmap(bitmap);// 为ImageView设置内容
			// 居中等比例缩放图片
			viewHolder.imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
			// 设置每个缩略图所占的宽高
			viewHolder.imageView.setLayoutParams(new LinearLayout.LayoutParams(
					100, 100));
			// 设置边框效果
			viewHolder.imageView.setBackgroundResource(mGalleryItemBackground);
			convertView.setTag(viewHolder);
		} else {
			// 有convertView,按样式,取得不用的布局
			viewHolder = (ViewHolder) convertView.getTag();
		}
		return convertView;
	}

	/**
	 * 
	 * 按照压缩比率获取bitmap,数字越大越清晰,压缩比越小
	 * 
	 * @param position
	 *            位置
	 * @param width
	 *            压缩的宽度比率,越大越清晰
	 * @param height
	 *            压缩的高度比例,越大越清晰
	 * @return bitmap对象
	 */
	private Bitmap getBitmap(int position, int width, int height) {
		Bitmap bitmap = null;
		BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true; // 可以编码
		BitmapFactory.decodeFile(
				imgPathlist.get(position % imgPathlist.size()), options);
		if (options.outHeight > 0 && options.outWidth > 0) {
			options.inJustDecodeBounds = false;
			options.inSampleSize = 2; // 长、宽缩小到原来的1/2,像素缩小到原来的1/4,减少内存的消耗
			while (options.outWidth / options.inSampleSize > width
					&& options.outHeight / options.inSampleSize > height) {
				options.inSampleSize++; // 增加压缩比
				Log.i("photo", "h-->" + options.outHeight + ",w---->"
						+ options.outWidth + ",ss-->" + options.inSampleSize
						+ ",压缩比-->" + options.outWidth / options.inSampleSize
						+ "/" + options.outHeight / options.inSampleSize);
			}
			options.inSampleSize--;

			bitmap = BitmapFactory.decodeFile(
					imgPathlist.get(position % imgPathlist.size()), options);
			if (bitmap != null) {
				bitmap = Bitmap
						.createScaledBitmap(bitmap, width, height, false);
			}
		}
		return bitmap;
	}

	/**
	 * 
	 * @Title:各个布局的控件资源
	 * @Description: 缩略图的映射
	 * @Copyright: Copyright (c) 2013
	 * @version: 1.0.0.0
	 * @Date: 2013-12-10
	 */
	class ViewHolder {
		ImageView imageView;
	}

显示效果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值