ImageView,Bitmap的浅析

本文探讨了在Android应用中,如何使用ImageView和Bitmap处理图片。启动时,ImageView常用于展示静态图片,Bitmap用于图像缩放等处理。具体实现包括将图片放入资源包,ImageView宽度填充屏幕,高度自适应,Bitmap按比例缩放以适应屏幕。同时,讨论了ImageView的background和src属性的区别,background会填充整个组件,而src保持图片原有比例。最后,举例说明了Bitmap对图片进行处理的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多low,也得做好总结——题记

一个app客户端启动时候,一般会在开始的欢迎界面展示图片,这时候会用的ImageView组件负责展示(一般是静态图片),图片的处理(包括缩放等)则需要用的Bitmap类来处理,这是这个两个类在功能上的区别,今天看了公司的项目,发现了欢迎界面的图片展示是通过这样的逻辑实现的:

1.将图片A放到资源包里面

2.在欢迎界面中,使用imageview组件,宽度为match_parent,占据整个屏幕,而高度设置为wrap_content,没有设置默认图片资源(src属性),也没有设置背景(background)属性

3.在activity中,使用bitmap类对图片A进行处理,这时候需要按照长宽比进行缩放到水平方向刚好占据整个屏幕

· 4.对imageview组件设置默认图片资源。


解决完问题后,想了解Imageview组件设置background的效果和设置src的效果有什么不同,上网查了些资料,发现background的属性,是将资源文件完全填充到imageview组件中区,imageview组件的宽高决定了这张图片显示时候的比例。而src属性,则是将这个图片插入到这个imageview组件中,imageview的宽高,不影响src显示时候的比例和大小,但是可能会影响到显示的是哪个部分(当src图片比imageview的大小要更大的时候)

Bitmap对src图片进行处理的时候,举例如下:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.png_01);
DisplayMetrics dm = new DisplayMetrics();   //创建DisplayMetrics对象,
getWindowManager().getDefaultDisplay().getMetrics(dm);  //获取屏幕的默认尺寸。

int width =  dm.widthPixels;//屏幕横向的像素
int height = dm.heightPixels;//屏幕纵向的像素
double bili = (double)(bitmap.getHeight()/bitmap.getWidth());//资源图片的宽高比例
int gao = (int)(bili*width);
Bitmap img = Bitmap.createScaledBitmap(bitmap,width,gao,true );//对资源图片重现定义宽高,并显示




### 解决Android ImageView加载大尺寸Bitmap导致内存溢出的方法 当处理大型图片文件时,直接加载整个图像到内存中可能会引发`OutOfMemoryError`异常。为了避免这种情况发生,可以采用多种策略来优化图片加载过程。 #### 使用缩放比例加载适当大小的图像 通过计算合适的采样率(`inSampleSize`),可以在解码之前缩小原始图片尺寸,从而减少占用的内存空间。具体实现方式如下: ```java public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) { inSampleSize *= 2; } } return inSampleSize; } ``` 接着,在实际读取图片前设置此参数: ```java final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, options); // Calculate inSampleSize based on required dimensions. options.inSampleSize = calculateInSampleSize(options, targetWidth, targetHeight); options.inJustDecodeBounds = false; // Now decode with actual size. Bitmap scaledBitmap = BitmapFactory.decodeFile(filePath, options); imageView.setImageBitmap(scaledBitmap); ``` 这种方法能够有效降低所占内存并提高性能[^1]。 #### 利用异步线程进行后台处理 为了防止阻塞主线程影响用户体验,建议利用`AsyncTask`或其他并发机制将耗时操作移至子线程执行。这不仅有助于提升应用响应速度,还能避免因长时间等待而引起的ANR(Application Not Responding)现象。 ```java private class LoadImageTask extends AsyncTask<String, Void, Bitmap> { private WeakReference<ImageView> imageViewWeakReference; public LoadImageTask(ImageView imageView){ this.imageViewWeakReference = new WeakReference<>(imageView); } @Override protected Bitmap doInBackground(String... params) { String filePath = params[0]; try{ final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath,options ); options.inSampleSize = calculateInSampleSize(options,targetWidth ,targetHeight ); options.inJustDecodeBounds=false ; return BitmapFactory.decodeFile(filePath,options ); }catch(Exception e){ Log.e("LoadImageTask",e.getMessage()); return null ; } } @Override protected void onPostExecute(Bitmap result) { super.onPostExecute(result); if(isCancelled()){ result=null ; } if(imageViewWeakReference !=null ){ ImageView imageView=imageViewWeakReference.get(); if(imageView!=null &&result !=null ) imageView.setImageBitmap(result ); } } } new LoadImageTask(imageView).execute(pathToYourImage); ``` 上述方法确保了即使在复杂场景下也能平稳运行而不至于消耗过多资源[^3]。 #### 考虑使用第三方库简化开发流程 对于更复杂的项目或者希望快速集成高质量解决方案的情况,考虑引入成熟的开源框架如Glide或Picasso等。这些工具提供了丰富的功能集以及良好的兼容性和稳定性支持,极大地方便开发者专注于核心业务逻辑的设计与实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值