ImagView 顯示圖片的原理初步分析

左上顯示:以圖片的左上頂點和ImagView的左上頂點爲基準,將圖片顯示。
居中顯示:以圖片的幾何中心點和ImagView的幾何中心點爲基準,將圖片顯示。
右下顯示:以圖片的右下頂點和ImagView的右下頂點爲基準,將圖片顯示。android

ImageView的默認狀態scaleType="fitCenter"
1.ImageView[match_parent,match_parent]
scaleType="matrix" 左上顯示原圖(圖片超出部分截掉,未超出部分上背景色)。
scaleType="fitXY" 把圖片伸縮到填滿ImageView ,不保持原比例。
scaleType="fitStart" 把圖片按比例擴大(縮小)到等於或小於ImageView的寬度(長度),左上顯示(圖片未超出部分上背景色)。
scaleType="fitCenter" 把圖片按比例擴大(縮小)到等於或小於ImageView的寬度(長度),居中顯示(圖片未超出部分上背景色)。
scaleType="fitEnd" 把圖片按比例擴大(縮小)到等於或小於ImageView的寬度(長度),右下顯示(圖片未超出部分上背景色)。
scaleType="center" 居中顯示原圖(圖片超出部分截掉,未超出部分上背景色)。
scaleType="centerCrop" 把圖片按比例擴大(縮小)到等於或大於ImageView的寬度(長度),居中顯示被處理過的圖片(圖片超出部分截掉)。
scaleType="centerInside" 把圖片按比例擴大(縮小)到等於或小於ImageView的寬度(長度),居中顯示被處理過的圖片(圖片未超出部分上背景色)。
注:此佈局下,原圖和ImageView尺寸一致的話,scaleType無心義。ide

2.ImageView[wrap_content,wrap_content]
小圖的話都是恰好包裹圖片,大圖同ImageView[match_parent,match_parent]。
3.ImageView[match_parent,wrap_content]
小圖的話是限定ImageView尺寸+參數,大圖同ImageView[match_parent,match_parent]。
4.ImageView[wrap_content,match_parent]
小圖的話是限定ImageView尺寸+參數,大圖同ImageView[match_parent,match_parent]。佈局

結論:match_parent等參數和scaleType的意義在於,圖片尺寸服從ImageView。
所以,ImageView藉助scaleType的問題:只要原圖和ImageView尺寸不一致,那麼就有可能存在圖片部分被截掉或ImageView被上背景色。
那麼,要ImageView原比例剛好完整地顯示圖片,須:
一、bitmap和ImageView尺寸同樣;
二、bitmap大圖,ImageView等比例;
...
注:小圖,ImageView等比例無效的,由於wrap_content會發生做用url

應用:
一、不規則圖片顯示(瀑布流)【ImageView服從圖片尺寸】
根據限定寬/高(依賴設備)算出bitmap的寬高,再肯定ImageView的寬高;
注:抹去了match_parent等參數和(抹平了)scaleType的做用和影響;
缺點:獲得bitmap才能知道佈局的寬高。
解決方案:將原圖寬高與圖片url一塊兒做爲第一次http請求的返回值。spa

 

 

最終最簡解決方案
android:adjustViewBounds="true" 調整ImageView的界限來保持圖像縱橫比不變。
android:scaleType="centerCrop"
說明:
1.android:adjustViewBounds="true"會將這個ImageView的scaleType設爲fitCenter;
2.不過這個fitCenter會被後面定義的android:scaleType="centerCrop"屬性覆蓋。圖片

相關文章
相關標籤/搜索