Android ImageView 常見問題與使用總結
阿新 • • 發佈:2019-01-02
一、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目錄下,但是在不同解析度手機上會根據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”