前言
最近聽(tīng)朋友說(shuō)簡(jiǎn)書(shū)很好用,自己也看了下,的確,界面簡(jiǎn)潔,看起來(lái)很舒適。這篇文章紀(jì)錄一些在日常Android開(kāi)發(fā)中的小知識(shí),也屬于連載文章吧,會(huì)定期更新,歡迎大家瀏覽。
開(kāi)發(fā)小知識(shí)
1、如何設(shè)置TextView的行間距
在xml布局文件中新增lineSpacingExtra,如下:
android:lineSpacingExtra="10dp"
2、為什么要在BitmapFactory.Options設(shè)置inJustDecodeBounds?
? ?通過(guò)設(shè)置BitmapFactory.Options中的inJustDecodeBounds為true,可以在解碼的時(shí)候避免內(nèi)存的分配,它會(huì)返回一個(gè)null的Bitmap,但是可以獲取到outWidth,outHeight與outMimeType。可以在構(gòu)造 Bitmap之前優(yōu)先讀圖片的尺寸與類(lèi)型。
BitmapFactory.Options options =newBitmapFactory.Options();
options.inJustDecodeBounds =true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
intimageHeight = options.outHeight;
intimageWidth = options.outWidth;
String imageType = options.outMimeType;
為了避免java.lang.OutOfMemory的異常,我們需要在真正解析圖片之前檢查它的尺寸(除非你能確定這個(gè)數(shù)據(jù)源提供了準(zhǔn)確無(wú)誤的圖片且不會(huì)導(dǎo)致占用過(guò)多的內(nèi)存)。
通過(guò)上面的步驟我們已經(jīng)獲取到了圖片的尺寸,這些數(shù)據(jù)可以用來(lái)幫助我們決定應(yīng)該加載整個(gè)圖片到內(nèi)存中還是加載一個(gè)縮小的版本。有下面一些因素需要考慮:
評(píng)估加載完整圖片所需要耗費(fèi)的內(nèi)存。
程序在加載這張圖片時(shí)可能涉及到的其他內(nèi)存需求。
呈現(xiàn)這張圖片的控件的尺寸大小。
屏幕大小與當(dāng)前設(shè)備的屏幕密度。
例如,如果把一個(gè)大小為1024x768像素的圖片顯示到大小為128x96像素的ImageView上,就沒(méi)有必要把整張?jiān)瓐D都加載到內(nèi)存中。
為了告訴解碼器去加載一個(gè)縮小版本的圖片到內(nèi)存中,需要在BitmapFactory.Options中設(shè)置 inSampleSize 的值。例如, 一個(gè)分辨率為2048x1536的圖片,如果設(shè)置 inSampleSize 為4,那么會(huì)產(chǎn)出一個(gè)大約512x384大小的Bitmap。加載這張縮小的圖片僅僅使用大概0.75MB的內(nèi)存,如果是加載完整尺寸的圖片,那么大概需要花費(fèi)12MB(前提都是Bitmap的配置是 ARGB_8888)。下面有一段根據(jù)目標(biāo)圖片大小來(lái)計(jì)算Sample圖片大小的代碼示例:
public static intcalculateInSampleSize(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) {
? ? ? ? ? ? ? ? final ?int ?halfHeight = height /2;
? ? ? ? ? ? ? ? final ?int ?halfWidth = width /2;
? ? ? ? ? ? ? // 保證壓縮后的寬高都不小于要求的寬高。
? ? ? ? ? ? ? ?while((halfHeight / inSampleSize) > reqHeight ? && (halfWidth / inSampleSize) > reqWidth) {?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?inSampleSize *=2;? ? ? ?
? ? ? ? ? ? ? ?}? ?
? ? ? ?}
returnin ? SampleSize;
}
Note:設(shè)置inSampleSize為2的冪是因?yàn)榻獯a器最終還是會(huì)對(duì)非2的冪的數(shù)進(jìn)行向下處理,獲取到最靠近2的冪的數(shù)。
為了使用該方法,首先需要設(shè)置inJustDecodeBounds為true, 把options的值傳遞過(guò)來(lái),然后設(shè)置inSampleSize的值并設(shè)置 inJustDecodeBounds 為false,之后重新調(diào)用相關(guān)的解碼方法。
public static Bitmap decodeSampledBitmapFromResource(Resources res,int ?resId,int ?reqWidth,int ?reqHeight){
? ? ? ? ? ? ? final ? BitmapFactory.Options options =newBitmapFactory.Options(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?options.inJustDecodeBounds =true;
? ? ? ? ? ? ? BitmapFactory.decodeResource(res, resId, options);
? ? ? ? ? ? ? options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
? ? ? ? ? ? ? options.inJustDecodeBounds =false;
? ? ? ? ? ? ? returnBitmapFactory.decodeResource(res, resId, options);
}
使用上面這個(gè)方法可以簡(jiǎn)單地加載一張任意大小的圖片。如下面的代碼樣例顯示了一個(gè)接近100x100像素的縮略圖:
mImageView.setImageBitmap(? ? decodeSampledBitmapFromResource(getResources(), R.id.myimage,100,100));
我們可以通過(guò)替換合適的BitmapFactory.decode*方法來(lái)實(shí)現(xiàn)一個(gè)類(lèi)似的方法,從其他的數(shù)據(jù)源解析Bitmap。