亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android如何高效顯示較大的Bitmaps

 更新時(shí)間:2016年05月23日 16:10:49   作者:pobi  
這篇文章主要為大家詳細(xì)介紹了Android如何高效顯示較大Bitmaps的方法,感興趣的小伙伴們可以參考一下

一、高效加載較大的Bitmaps

     圖片有各種形狀和各種大小,在很多情況下,圖片的實(shí)際大小都比圖片在應(yīng)用中所顯示的大小要大的多,比如Android系統(tǒng)自帶的 Gallery  應(yīng)用顯示的照片實(shí)際的分辨率通常比手機(jī)設(shè)備的密度要高很多

     考慮到我們是在開發(fā)一款內(nèi)存使用受限的應(yīng)用,理想的情況下,我們只是想把一個(gè)低分辨率版本的位圖載入內(nèi)存,一般來(lái)說(shuō)這個(gè)低分辨率版本的位圖要跟UI元件實(shí)際需要顯示的大小相符。一張高分辨率的圖片并不會(huì)給我們帶來(lái)任何明顯的好處,但卻會(huì)占用寶貴的內(nèi)存資源和產(chǎn)生額外的性能開銷

二、獲取Bitmap的尺寸大小和類型

     BitmapFactory 類為我們提供了幾種decoding方法(decodeByteArray(), decodeFile(),decodeResource(), etc)來(lái)從不同的來(lái)源創(chuàng)建出 Bitmap ,如何選擇最恰當(dāng)?shù)膁ecode方法取決于你的圖片數(shù)據(jù)來(lái)源,這些方法都會(huì)去嘗試申請(qǐng)內(nèi)存來(lái)構(gòu)建Bitmap對(duì)象,所有很容易就會(huì)導(dǎo)致一個(gè)OutOfMemory  異常,每種類型的decode方法都有額外的簽名來(lái)讓你通過(guò) BitmapFactory.Options 類來(lái)指定decoding選項(xiàng),當(dāng)我們decoding的時(shí)候把inJustDecodeBounds 屬性設(shè)置為true 可以避免申請(qǐng)內(nèi)存,雖然會(huì)返回一個(gè)null Bitmap對(duì)象 ,但是會(huì)為我們傳入的BitmapFactory.Options  對(duì)象設(shè)置 outWidth, outHeight and outMimeType 等屬性的值,這個(gè)技術(shù)可以讓你在構(gòu)建Bitmap對(duì)象之前事先知道它的大小和類型

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之前你有必要去檢測(cè)Bitmap的大小和類型,除非你真的是非常清楚你要decoding的Bitmap的大小,還有這個(gè)大小要適合當(dāng)前應(yīng)用內(nèi)存環(huán)境

三、載入‘縮小版'的Bitmap到內(nèi)存

     現(xiàn)在我們已經(jīng)知道了Bitmap的大小,這將有助于我們來(lái)決策是載入整張Bitmap還是載入'縮小版'的Bitmap,這里有一些因素需要進(jìn)行考慮:

1、載入整張圖片預(yù)計(jì)要使用多少內(nèi)存

2、在考慮到其它方面內(nèi)存需要的情況下,你想把多少數(shù)量的內(nèi)存給Bitmap使用:

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

4、當(dāng)前設(shè)備屏幕的大小和密度    

例如,一點(diǎn)都不值得載入1024x768  像素的圖片到內(nèi)存中,而最終只在128x96 像素大小的 ImageView 控件上顯示       

我們應(yīng)該告訴decoder,圖像需要進(jìn)行抽樣,載入一個(gè)更小號(hào)的Bitmap到內(nèi)存中,設(shè)置 BitmapFactory.Options 對(duì)象的 inSampleSize 屬性為true 。例如,一張分辨率為2048x1536 像素的圖片,如果decode的時(shí)候把inSampleSize   設(shè)置為4,那么得到的最終圖片的大小大約為512x384 ,載入內(nèi)存耗費(fèi)0.75M而不是載入整張時(shí)的12M (假設(shè)位圖的配置為 ARGB_8888) ,下面有一個(gè)在目標(biāo)高和寬基礎(chǔ)上計(jì)算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的冪的話,對(duì)于decoder來(lái)說(shuō)會(huì)更快和更高效。然而,如果你想把調(diào)整過(guò)大小的位圖緩存到內(nèi)存或硬盤上時(shí),依然非常有意義decoding最合適的位圖大小,這樣有助于節(jié)省內(nèi)存或節(jié)省硬盤空間

下面是一個(gè)獲取位圖的方法

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); 
} 

這個(gè)方法可以很容易的做到在任意顯示尺寸大小的UI元件中去載入一張位圖

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

在其他的BitmapFactory.decode*  系列的decode方法中以上獲取位圖的技術(shù)也是需要的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)Android軟件編程有所幫助。

相關(guān)文章

  • Android 對(duì)話框 Dialog使用實(shí)例講解

    Android 對(duì)話框 Dialog使用實(shí)例講解

    對(duì)話框是在當(dāng)前的頁(yè)面之上彈出的小窗口, 用于顯示一些重要的提示信息, 提示用戶的輸入,確認(rèn)信息,或顯示某種狀態(tài).如 : 顯示進(jìn)度條對(duì)話框, 退出提示.接下來(lái)通過(guò)本文給大家介紹android dialog對(duì)話框知識(shí),感興趣的朋友一起看看吧
    2016-09-09
  • Android自定義控件打造絢麗平行空間引導(dǎo)頁(yè)

    Android自定義控件打造絢麗平行空間引導(dǎo)頁(yè)

    這篇文章主要為大家詳細(xì)介紹了Android自定義控件打造絢麗平行空間引導(dǎo)頁(yè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android開機(jī)自啟動(dòng)程序詳解

    Android開機(jī)自啟動(dòng)程序詳解

    本篇文章是對(duì)Android開機(jī)自啟動(dòng)程序進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Android進(jìn)階篇-自定義圖片伸縮控件具體實(shí)例

    Android進(jìn)階篇-自定義圖片伸縮控件具體實(shí)例

    這篇文章介紹了Android自定義圖片伸縮控件具體實(shí)例,有需要的朋友可以參考一下
    2013-11-11
  • 一文帶你了解Android系統(tǒng)的啟動(dòng)流程

    一文帶你了解Android系統(tǒng)的啟動(dòng)流程

    Android系統(tǒng)的啟動(dòng)是一個(gè)復(fù)雜的過(guò)程,涉及到多個(gè)階段和組件,所以本文將給大家詳細(xì)的介紹一下Android系統(tǒng)的啟動(dòng)流程,文中也有圖片和代碼示例的講解,需要的朋友可以參考下
    2023-09-09
  • Android getActivity()為空的問(wèn)題解決辦法

    Android getActivity()為空的問(wèn)題解決辦法

    這篇文章主要介紹了Android getActivity()為空的問(wèn)題解決辦法的相關(guān)資料,導(dǎo)致apk空指針崩潰問(wèn)題,很嚴(yán)重的問(wèn)題,為了解決這問(wèn)題,上網(wǎng)搜索了很多資料,需要的朋友可以參考下
    2017-07-07
  • android實(shí)現(xiàn)滑動(dòng)解鎖

    android實(shí)現(xiàn)滑動(dòng)解鎖

    這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)滑動(dòng)解鎖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Android 模仿iPhone列表數(shù)據(jù)View刷新動(dòng)畫詳解

    Android 模仿iPhone列表數(shù)據(jù)View刷新動(dòng)畫詳解

    本文主要介紹Android 模仿iPhone列表數(shù)據(jù)view 刷新動(dòng)畫的資料,這里整理詳細(xì)的資料,并附示例代碼及實(shí)現(xiàn)效果圖,有興趣的小伙伴可以參考下
    2016-09-09
  • Android 如何查看Wifi密碼

    Android 如何查看Wifi密碼

    這篇文章主要介紹了Android 如何查看Wifi密碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Android實(shí)現(xiàn)動(dòng)態(tài)體溫計(jì)

    Android實(shí)現(xiàn)動(dòng)態(tài)體溫計(jì)

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)動(dòng)態(tài)體溫計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06

最新評(píng)論