Android:談談最被誤讀的屬性adjustViewBounds

adjustViewBounds到底是什么意思?

今天,和大家聊聊ImageView上的adjustViewBounds屬性。這個屬性其實用的也比較多,可有意思的是,網上對這個屬性的解釋,大部分都是錯誤或者不準確的。

今天這篇文章,就結合我個人的理解,和大家聊聊adjustViewBounds到底是什么意思。


首先,澄清兩個概念:ImageView和圖片

ImageView:Android里用來顯示圖片的控件。ImageView的長寬可以設定為固定值:比如,100dp或match_parent。也可以設定為不固定值:wrap_content。

ImageView的比例:ImageView的長/寬

圖片:要顯示在ImageView上的圖片,起長寬由其物理size決定的。比如200px*300px等。

圖片的比例:圖片的長/寬

總之,ImageView有自己的長寬,也有自己的原始比例(長/寬)。圖片也有自己的長寬,有自己的原始比例。ImageView和圖片的長寬及其比例其實是獨立的。圖片如何被顯示在ImageView上,由scaleType、adjustViewBounds等屬性共同決定。

網上對adjustViewBounds的錯誤解釋

了解完兩個基本概念,接下來看看網上對adjustViewBounds都是怎么解釋的。

首先,大多數介紹adjustViewBounds的文章,都會先搬出Google的官方介紹:

Adjust the ImageView's bounds to preserve the aspect ration of its drawable.

然后對上面英文的解釋是:調整ImageView的界限來保持圖片縱橫比不變。

這個解釋是錯誤的!

首先,adjustViewBounds不管是設置成true還是false,都是不會影響圖片本身的比例的(長/寬)!注意,這里說的是長寬比例,而不是具體的長和寬。目前為止,只有scaleType=FIT_XY的時候才會有可能影響到圖片的比例。

實際上,adjustViewBounds影響的是ImageView的比例(不是圖片的比例),所以,對于adjustViewBounds的定義應該是這樣:

調整ImageView的邊界,使得ImageView和圖片有一樣的長寬比例。

接下來我會用具體的例子給大家展示下adjustViewBounds的用法。


情況1,當ImageView的寬高都是固定值的時候,adjustViewBounds屬性無效

看下面這個例子:

    <ImageView
        android:layout_width="1000px"
        android:layout_height="1000px"
        android:background="@android:color/holo_red_light"
        android:adjustViewBounds="false"
        android:layout_gravity="center"
        android:src="@drawable/image_300_400">
    </ImageView>

首先,我有一個ImageView,寬高都設成固定的值:1000px,這個ImageView的寬高比例就是1。

在這個ImageView上我要顯示一個圖片(image_300_400),寬300px,高400px,寬高比是3:4。

另外我給這個ImageView設置了紅色的背景,方便大家查看ImageView和圖片的關系。

在ImageView大小固定的時候,adjustViewBounds的值無論設成什么,效果都是下面的樣子:


ImageView大小固定的情況

通過上圖,大家可以清楚的看到:ImageView和圖片都分別保持了自己原始比例(1:1和3:4),因為二者的比例不同,所以圖片是不會撐滿ImageView的,紅色的部分就是ImageView沒有被圖片填滿的部分(ImageView的background是紅色)。

在這個例子里,圖片的比例雖然沒有變,但是被拉伸了,這是因為ImageView的默認scaleType是FIT_CENTER,這個就是FIT_CENTER的效果。關于ImageView的scaleType的說明,可以參考這篇文章:圖文講解Android ImageView的ScaleType,幫你徹底搞明白

情況2,ImaegView一邊長度固定,另一邊為wrap_content的情況

我把上面的例子稍微改下,把ImageView的高度改成wrap_content,adjustViewBounds設為false:

   <ImageView
        android:layout_width="1000px"
        android:layout_height="wrap_content"
        android:background="@android:color/holo_red_light"
        android:adjustViewBounds="false"
        android:layout_gravity="center"
        android:src="@drawable/image_300_400">
    </ImageView>

出來的效果是這樣的:


寬度固定,高度改成wrap_content,adjustViewBounds設為true

怎么樣,是不是和你想的不一樣?

要理解上面這個效果,要先理解ImageView的wrap_content是什么意思?

當ImageView的某一個邊設置為wrap_content的時候,會根據內容的實際大小來決定實際長度。這里,就是根據圖片的實際長度來決定。在這個例子中,圖片的實際的高度是400px,所以ImageView的寬高就是1000px和400px。再加上FIT_CENTER,呈現的效果就是這樣。

下面我們把adjustViewBounds設為true試試,

    <ImageView
        android:layout_width="1000px"
        android:layout_height="wrap_content"
        android:background="@android:color/holo_red_light"
        android:adjustViewBounds="true"
        android:layout_gravity="center"
        android:src="@drawable/image_300_400">
    </ImageView>

現在的效果變成這個樣子:


寬度固定,高度改成wrap_content,adjustViewBounds設為true

adjustViewBounds屬性終于生效了!因為這個值,ImageView需要和圖片有一樣的寬高比,所以這時候ImageView的高度為1000*400/300。ImageView的寬高比也變成了3:4,再加上FIT_CENTER,圖片可以完美的鋪滿整個ImageView!沒有一點紅色背景露出。這也是我們大多數情況下想要的效果。

情況3,當ImageView的寬高都設置為wrap_content的情況

在這種情況下,adjustViewBounds也是無效的。

   <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/holo_red_light"
        android:adjustViewBounds="true"
        android:layout_gravity="center"
        android:src="@drawable/image_300_400">
    </ImageView>

這時候的效果是這樣的:


寬度高度都是wrap_content,adjustViewBounds設為true或false的效果

前面說了,wrap_content是用原始的圖片尺寸顯示,所以,這個時候ImageView的長寬和原始圖片一樣,都是400px和300px。比例自然和圖片也一樣(4:3),所以這個時候圖片也可以鋪滿整個ImageView。

總結:

綜上所述,adjustViewBounds只有在ImageView一邊固定,一邊為wrap_content的時候才有意義。設置為true的時候,可以讓ImageView的比例和原始圖片一樣,以達到讓圖片充滿的ImageView的效果。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容