1. 程式人生 > >Android ImageView 常見問題與使用總結

Android ImageView 常見問題與使用總結

一、src 與 background的區別?

1. ImageView支援上下兩層可以同時設定,src顯示的圖片會覆蓋background圖片

2. background會根據ImageView的大小自動拉伸,而src不會
3. src可以根據gravity 顯示在不同位置,可以根據 scaleType、setDensity控制展示方式與縮放


二、支援不同解析度相關屬性

1. anyDensity屬性,螢幕適配時是否考慮Density因素

可以在AndroidManifest.xml中設定<supports-screens android:anyDensity="true"/> 或者程式碼設定BitmapFactory.Options.inScaled = true;

以下內容載錄自

《android 螢幕適配問題》
第一:android:anyDensity="true",系統會依據螢幕密度,自動去找對應的資料夾
第二:android:anyDensity="false",
(1) 如果drawable-hdpi,drawable-mdpi,drawable-ldpi三個資料夾中有同一張圖片資源的不同密度表示,那麼系統會去載入drawable_mdpi資料夾中的資源
(2) 如果drawable-hpdi中有高密度圖片,其它兩個資料夾中沒有對應圖片資源,那麼系統會去載入drawable-hdpi中的資源。
(3) 如果drawable-hdpi,drawable-mdpi中有圖片資源,drawable-ldpi中沒有對應的圖片資源,那麼系統會載入drawable-mdpi資料夾中的資源

2.  scaleType屬性,當ImageView大於或者小於圖片大小時如何處理

注意:android:background=""會根據ImageView的寬高進行拉伸,android:scaleType僅針對android:src="" 進行拉伸。

以下兩張圖片來自《android ImageView scaleType屬性》

  圖1: 圖比ImageView小 實驗截圖
圖2: 圖片比ImageView大的截圖

3. Bitmap.setDensity(int density)方法

3.1 先來看下官方文件:
public void setDensity (int density)
Specifies the density for this bitmap. When the bitmap is drawn to a Canvas that also has a density, it will be scaled appropriately.
為bitmap物件設定denstiy屬性,當bitmap繪製時也存在denstiy,這樣會對圖片進行適當的縮放。

3.2 res資料夾與density對照表
Android專案中目錄名(密度Group) 螢幕(Type) 尺寸(Inches) 寬高(Pixels) 單位PX 密度(Density) 比例
drawable
drawable-hdpi  高解析度 3.3 ~ 4.0 480x800 240 3/2
drawable-mdpi 中解析度 3.0 ~ 3.5 320x480 160 1
drawable-ldpi 低解析度 2.6 ~ 3.0 240x320 120 3/4
加入圖片放在drawable-hdpi目錄下寬高是100*100, 如果在高解析度(hdpi)上顯示就是 100*100, 如果在中解析度螢幕顯示大小為67 * 67 。計算方式可以查詢dip轉換。 把高分畫素值轉換為中分畫素值公式 = 100 / 3 * 2。
以上同一張圖片放在drawable-hdpi目錄下,但是在不同解析度手機上會根據density來縮放大小。這些都是Android系統在讀取資源的時候做的手機適配處理。如果圖片不放在這些目錄下又想根據螢幕大小自動縮放如何處理呢?

例如:圖片是網路下發的,而圖片是按照高解析度(hdpi)做的寬高是100*100,此時就可以使用Bitmap.setDensity(DisplayMetrics.DENSITY_HIGH); 來聲明當前是按照高解析度(hdpi)的規則製作的,效果等同於放到drawable-hdpi目錄下。

看完以上解釋也應該可以區分出ImageView scaleType屬性與Bitmap.setDensity(int density)的區別
3.3 setDensity的引數是int型別,在DisplayMetrics類中定義,以下是符合條件的int型別常量,可以詳見DisplayMetrics類官方文件
int常量名 新增int 值Android 版本(Added in API level)
DENSITY_DEFAULT 4
DENSITY_HIGH 4
DENSITY_LOW 4
DENSITY_MEDIUM 4
DENSITY_XHIGH 9
DENSITY_TV 13
DENSITY_XXHIGH      16
DENSITY_XXXHIGH 18
DENSITY_400 19
DENSITY_560 21
DENSITY_280 22

4. BitmapDrawable.setTargetDensity(int density)方法

指定Bitmap繪製時的density,例如:高分手機上,當drawable-hdpi目錄圖片,讀取時設定BitmapDrawable.setTargetDensity(DisplayMetrics.DENSITY_LOW);  但是最後的顯示大小按照DENSITY_LOW(低分)計算,預設高分手機按照高分density計算。

5. android:adjustViewBounds屬性

android:adjustViewBounds=”true” ImageView按照圖片寬高比例展示。 如果ImageView 寬高都設定固定值,設定此屬性無效果。 如果ImageView 寬高都設定為warp_coent,設定此屬性無效果,因為圖片本身就按照自身的大小展示,不會修改寬高值也不會造成寬高比與圖片不一致的情況。 僅在ImageView 寬高僅有一個設定為固定值時生效。 6.  限制圖片最大寬高 android:maxWidth=”99dip”
android:maxHeight=”99dip”

三、圖片檔案格式

1. 圖片檔案格式區別 jpg 有損格式,檔案小,不支援透明 png 無損格式,檔案大,支援透明 2. ImageLoader支援哪種格式 3. android 不支援gif gif AnimationDrawable需要把圖片切分 開源專案GifView使用Moive進行解析,自己一幀一幀控制 使用WebView

四、疑問

bitmap複用問題