Android如何高效显示较大的Bitmaps_Android

一、高效加载较大的Bitmaps

     图片有各种形状和各种大小,在很多情况下,图片的实际大小都比图片在应用中所显示的大小要大的多,比如Android系统自带的 Gallery  应用显示的照片实际的分辨率通常比手机设备的密度要高很多

     考虑到我们是在开发一款内存使用受限的应用,理想的情况下,我们只是想把一个低分辨率版本的位图载入内存,一般来说这个低分辨率版本的位图要跟UI元件实际需要显示的大小相符。一张高分辨率的图片并不会给我们带来任何明显的好处,但却会占用宝贵的内存资源和产生额外的性能开销

二、获取Bitmap的尺寸大小和类型

     BitmapFactory 类为我们提供了几种decoding方法(decodeByteArray(), decodeFile(),decodeResource(), etc)来从不同的来源创建出 Bitmap ,如何选择最恰当的decode方法取决于你的图片数据来源,这些方法都会去尝试申请内存来构建Bitmap对象,所有很容易就会导致一个OutOfMemory  异常,每种类型的decode方法都有额外的签名来让你通过 BitmapFactory.Options 类来指定decoding选项,当我们decoding的时候把inJustDecodeBounds 属性设置为true 可以避免申请内存,虽然会返回一个null Bitmap对象 ,但是会为我们传入的BitmapFactory.Options  对象设置 outWidth, outHeight and outMimeType 等属性的值,这个技术可以让你在构建Bitmap对象之前事先知道它的大小和类型

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType; 

为了避免java.lang.OutOfMemory  异常,在decoding Bitmap之前你有必要去检测Bitmap的大小和类型,除非你真的是非常清楚你要decoding的Bitmap的大小,还有这个大小要适合当前应用内存环境

三、载入‘缩小版'的Bitmap到内存

     现在我们已经知道了Bitmap的大小,这将有助于我们来决策是载入整张Bitmap还是载入'缩小版'的Bitmap,这里有一些因素需要进行考虑:

1、载入整张图片预计要使用多少内存

2、在考虑到其它方面内存需要的情况下,你想把多少数量的内存给Bitmap使用:

3、用于显示Bitmap的 ImageView 控件或其它UI元件的大小

4、当前设备屏幕的大小和密度    

例如,一点都不值得载入1024x768  像素的图片到内存中,而最终只在128x96 像素大小的 ImageView 控件上显示       

我们应该告诉decoder,图像需要进行抽样,载入一个更小号的Bitmap到内存中,设置 BitmapFactory.Options 对象的 inSampleSize 属性为true 。例如,一张分辨率为2048x1536 像素的图片,如果decode的时候把inSampleSize   设置为4,那么得到的最终图片的大小大约为512x384 ,载入内存耗费0.75M而不是载入整张时的12M (假设位图的配置为 ARGB_8888) ,下面有一个在目标高和宽基础上计算inSampleSize 的方法

public static int calculateInSampleSize(
   BitmapFactory.Options options, int reqWidth, int reqHeight) {
 // Raw height and width of image
 final int height = options.outHeight;
 final int width = options.outWidth;
 int inSampleSize = 1; 

 if (height > reqHeight || width > reqWidth) {
  if (width > height) {
   inSampleSize = Math.round((float)height / (float)reqHeight);
  } else {
   inSampleSize = Math.round((float)width / (float)reqWidth);
  }
 }
 return inSampleSize;
}

NOTE :  inSampleSize  值是2的幂的话,对于decoder来说会更快和更高效。然而,如果你想把调整过大小的位图缓存到内存或硬盘上时,依然非常有意义decoding最合适的位图大小,这样有助于节省内存或节省硬盘空间

下面是一个获取位图的方法

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
  int reqWidth, int reqHeight) { 

 // First decode with inJustDecodeBounds=true to check dimensions
 final BitmapFactory.Options options = new BitmapFactory.Options();
 options.inJustDecodeBounds = true;
 BitmapFactory.decodeResource(res, resId, options); 

 // Calculate inSampleSize
 options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

 // Decode bitmap with inSampleSize set
 options.inJustDecodeBounds = false;
 return BitmapFactory.decodeResource(res, resId, options);
}

这个方法可以很容易的做到在任意显示尺寸大小的UI元件中去载入一张位图

mImageView.setImageBitmap(
 decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));

在其他的BitmapFactory.decode*  系列的decode方法中以上获取位图的技术也是需要的。

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, bitmap
Bitmaps
android高效操作数组、android高效加载大图、android 高效截屏、android 高效存储、android 高效画动态图,以便于您获取更多的相关知识。

时间: 2024-09-11 17:10:22

Android如何高效显示较大的Bitmaps_Android的相关文章

Android如何高效显示较大的Bitmaps

一.高效加载较大的Bitmaps 图片有各种形状和各种大小,在很多情况下,图片的实际大小都比图片在应用中所显示的大小要大的多,比如Android系统自带的 Gallery  应用显示的照片实际的分辨率通常比手机设备的密度要高很多 考虑到我们是在开发一款内存使用受限的应用,理想的情况下,我们只是想把一个低分辨率版本的位图载入内存,一般来说这个低分辨率版本的位图要跟UI元件实际需要显示的大小相符.一张高分辨率的图片并不会给我们带来任何明显的好处,但却会占用宝贵的内存资源和产生额外的性能开销 二.获取

如何在Android App上高效显示位图

为了创建具有视觉魅力的app,显示图像是必须的.学会在你的Android app上高效地显示位图,而不是放弃性能. 在Android上显示图像的痛苦 当工作于开发视觉魅力的app时,显示图像是必须的.问题是,Android操作系统不能很好地处理图像解码,从而迫使开发者要小心某些任务以避免搞乱性能. Google写了一个有关于高效显示位图的完整指南,我们可以按照这个指南来理解和解决在显示位图时Android操作系统的主要缺陷. Android app性能杀手 按照Google的指南,我们可以列出一

webview flash-求教大神:Android用webView显示flash文件是否可以快进,暂停?

问题描述 求教大神:Android用webView显示flash文件是否可以快进,暂停? 公司项目,需要显示flash,我用webView,但是可以实现一般播放器的功能吗:如:快进,快退,调节声音,下一曲等等. 问一下各位,播放flash还有其他的方案吗?项目组要对UI做大幅度定制 解决方案 用webView方案完全可行~

android recyclerview一行显示一列,下一行显示三列 ,求大神指导这个怎么写???

问题描述 android recyclerview一行显示一列,下一行显示三列 ,求大神指导这个怎么写??? 如题~~~~想了很久 ,没有思路,求大神指导~~~~~~~~!! 解决方案 这个是布局问题,做个判断就可以了

给android studio 重新分配更大内存的时候出现了无法修改的情况

问题描述 给android studio 重新分配更大内存的时候出现了无法修改的情况 因为重新装了一根内存条,以前给AS分配的运行内存是1G现在想重新分配2G给它,按照网上的教程,是修改studio64.exe.vmoptions文件中的参数就好了,结果最后无法保存文件,显示拒绝访问 解决方案 修改没问题 你这显示的奇怪呀,记事本怎么显示的是 studio64.exe -记事本 少了 .vmoptions studio64.exe.vmoptions -记事本

只显示月、日、时-Android请教:同时显示日期和时间选择器

问题描述 Android请教:同时显示日期和时间选择器 开发中遇到一个问题: 需要在一个控件中同时显示日期和时间选择器 要求:日期只显示月.日:时间只显示24小时制的时 网上翻了好久没看见合适的,请教各位路过的大神给一些思路或者解决方案 解决方案 http://www.iteye.com/topic/1131942挺好的,不要年份的话,可以到xml里面将年份隐藏 解决方案二: http://www.2cto.com/kf/201407/320686.html 解决方案三: 朋友你好,你发的这个链

缩放-Android 摄像头动画效果变大缩小

问题描述 Android 摄像头动画效果变大缩小 有一个CameraPreview类继承自SurfaceView主要用来显示摄像头图像.然后非全屏把这个 个类放在一个ViewGroup里面(说白了就是一个某个尺寸大小的摄像头预览界面). 问题开始了,我用Android属性动画对这个ViewGroup扩大或缩小,然后ViewGroup是能 正常扩大或缩小,可摄像头预览界面显示的数据不会跟随扩大或缩小..怎么办? 代码如 animator = ObjectAnimator.ofFloat( mLin

界面-android开发语音显示的问题

问题描述 android开发语音显示的问题 项目中聊天发语音模块在不同的手机上发语音消息,有的手机可以及时发出去并显示,有的手机发语音之后要退出聊天界面 之后才能显示,为啥啊,坐等各位大神解答,谢谢啦 解决方案 没有代码大家也不知道你怎么实现的阿...

安卓编程-android编程布局显示的问题

问题描述 android编程布局显示的问题 运行结果如图所示,但是运行结果不是我想要的,获取的新闻不能显示在listview上,想要的结果类似于那个点菜那样,如图所示public class MainActivity extends Activity { Document doc;@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView