android-------获取图片缩略图

背景:要实现本地文件夹下的图片缩略图的显示问题。

分析:首先在Adapter里面判断图片形式(以图片后缀名判断),如:

 if(fileType.equals("file"))
   {
       if(name.endsWith(".jpg") || name.endsWith(".jpeg")
                    || name.endsWith(".bmp") || name.endsWith(".gif")
                    || name.endsWith(".png") || name.endsWith(".SVG")
                    || name.endsWith(".tif") || name.endsWith(".tiff"))
           {
                Bitmap bmp = getImageThumbnail(listMediaFiles.get(position).getPath(), 100, 100);
                item.setImageBitmap(bmp);   //设置setImageBitmap()方法
                item.setChkVisible(true);
                item.setUploadInfoVisibility(true);

           }

       else
            {
                item.setImageResource(R.drawable.file_item);
                item.setChkVisible(true);
                item.setUploadInfoVisibility(true);
            }

  } 

再设

setImageBitmap()<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:14px;">方法。</span></span></span>

最后,调用getImageThumbnail()方法,直接上代码:

    /*
     * 根据指定的图像路径和大小来获取缩略图,此方法有两点好处:
     * 1、使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度,第二次读取的bitmap是根据比例缩放过的图像,第三次读取的bitmap是所要的缩略图。
     * 2、缩略图对于原图像来讲没有拉伸,这里使用了ThumbnailUtils,使用这个工具生成的图像不会被拉伸。
     * imagePath----图像的路径
     * width----指定输出图像的宽度
     * height----指定输出图像的高度
     * return----返回生成的缩略图
     */
  

 private Bitmap getImageThumbnail(String imagePath, int width, int height)
    {
        Bitmap bitmap = null;
        BitmapFactory.Options options = new BitmapFactory.Options();   //缩放图片,width、height按相同比例缩放图片
        options.inJustDecodeBounds = true;     //options为true时,构造出的bitmap没有图片,只有一些长宽等配置信息,但是速度快;也就是说,当inJustDecodeBounds为true时,bitmap并不加载到内存,这样效率很高。options为false时,才有图片。
        bitmap = BitmapFactory.decodeFile(imagePath, options);    //获取这个图像的宽和高,这里的bitmap为null
        options.inJustDecodeBounds = false;        //此处一定要设为false,真正解码图片
        //计算缩放比
        int h = options.outHeight;
        int w = options.outWidth;
        int beWidth = w / width;
        int beHeight = h / height;
        int be = 1;
        if (beWidth < beHeight)
        {
            be = beWidth;
        }
        else {
            be = beHeight;
        }
        if (be <= 0)
        {
            be = 1;
        }
        options.inSampleSize = be;   //inSampleSize是缩放比,如options.inSampleSize =8,就是原图的八分之一
        bitmap = BitmapFactory.decodeFile(imagePath, options);   //重新读入图片,读取缩放后的bitmap
        bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
                ThumbnailUtils.OPTIONS_RECYCLE_INPUT);   //利用ThumbnailUtils来创建缩略图,这里要指定缩放哪个Bitmap对象
        
        return bitmap;    //返回生成的缩略图
    }


TIPS:此方法很简单,其实它做了如下几件事:
1、根据传入的图片路径构造bitmap,得到原图的宽度和高度。
2、计算出图片合适的缩放比。
3、利用ThumbnailUtils来创建缩略图,然后返回这个最终缩放后的bitmap。
尽管此方法使用了较小的内存空间,但是整个方法还是开辟了3个bitmap对象的内存区域,这还没有考虑
ThumbnailUtils.extractThumbnail()方法所耗费的空间。
虽然最后我使用这个方法实现了在ListView中遍历本地文件夹下的图片,但上下滑动的时候还是非常的卡顿。
对于这种现象,个人觉得应该还有更好的方法用来解决这种问题,寻找ing。(将图片先放入缓存中就可以解决了)

最后,附上一张效果图




前面提到过上面这种方法实现的缩略图会出现卡顿的现象。

现在使用另一种方法来实现就不会出现这种问题了。

参考的:http://blog.csdn.net/joke124/article/details/50494973和http://blog.csdn.net/adayabetter/article/details/45047017

下面是我的实现过程:

在适配器中

if (name.endsWith(".jpg") || name.endsWith(".jpeg")
					|| name.endsWith(".png")
					|| name.endsWith(".bmp")
					|| name.endsWith(".gif")
					
					|| name.endsWith(".psd"))
			{
				String path = listMediaFiles.get(position).getPath();
				item.mImageView.setTag(path);
				Bitmap bitmap = ImageLoader.getInstance().<strong>loadNativeImage</strong>(path, new NativeImageCallBack()
				{

					@Override
					public void onImageLoader(Bitmap bitmap, String path) {
						
						ImageView mImageView = (ImageView)mListView.findViewWithTag(path);
						if(bitmap != null && mImageView != null)
						{
						   mImageView.setImageBitmap(bitmap);
						}
					}
					
				});
				if(bitmap != null)
			     {
					item.setImageBitmap(bitmap);
			     }
                         else
			     {
			         item.mImageView.setImageResource(R.drawable.friends_sends_pictures_no);
			      }

public Bitmap loadNativeImage(final String path, final NativeImageCallBack mCallBack){
		Bitmap bitmap = getBitmapFromMemCache(path);	
		final Handler mHander = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				mCallBack.onImageLoader((Bitmap)msg.obj, path);
			}
		};
		if(bitmap == null){
			mImageThreadPool.execute(new Runnable() {
				@Override
				public void run() {
					Bitmap mBitmap = decodeThumbBitmapForFile(path, 200,200);
					Message msg = mHander.obtainMessage();
					msg.obj = mBitmap;
					mHander.sendMessage(msg);
					addBitmapToMemoryCache(path, mBitmap);		
				}
			});
		}
		return bitmap;
	}
这里关键是使用 imageloader加载图片。

setTag():  此外,Adapter 有个getView方法,可以使用setTag把查找的view缓存起来方便多次重用。如

public View getView(int position, View convertView, ViewGroup parent) {
       ViewHolder vh;

       if (convertView == null) {
               LayoutInflater inflater = (LayoutInflater) mWidgetsSwitchApp
                               .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
               convertView = inflater.inflate(R.layout.app_gallery_item, null);
               vh = new ViewHolder();
               vh.view1 = (ImageView) convertView.findViewById(R.id.view1);
               vh.view2 = (ImageView) convertView.findViewById(R.id.view2);
               vh.view3= (ImageView) convertView.findViewById(R.id.view3);
               vh.view4 = (ImageView) convertView.findViewById(R.id.view4);
               convertView.setTag(vh);
       } else {
               vh = (ViewHolder) convertView.getTag();
       }

View中的setTag(Object)表示给View添加一个额外的数据,以后可以用getTag()将这个数据取出来。

setTag(),取出来的是对象所指向的对象。与setId()不同,findViewById找到的是对象本身。

在同一个类中,存取数据很方便,不用数据库建库,也比sharePreference更节约内存。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值