為避免歧義巴刻,我們首先來明確下文章標(biāo)題的具體含義愚铡。對于一個 ImageView,所謂“高度固定胡陪,寬度自適應(yīng)”在這里是指這個 ImageView 的高度取我們預(yù)設(shè)好的一個固定值沥寥,待展示圖像要鋪滿 ImageView 的高度(這點(diǎn)很重要!也是最不容易滿足的一點(diǎn)需求D)邑雅,ImageView 的寬度隨圖像比例自適應(yīng),即在不超出屏幕物理顯示范圍的前提下根據(jù)待展示圖像的長寬比和自身高度來確定自身寬度妈经。
大家在實際項目開發(fā)中可能都遇到過這種需求淮野,就是有一些圖片需要展示給用戶,有意思的是這些圖片的長寬比可能不一致吹泡。然后呢骤星,我們的界面設(shè)計中給圖片留的高度(寬度)可能是固定的,但相對的爆哑,寬度(高度)可能不需要固定洞难,相對于父 View 在特定方向居中顯示就行。
這時候我們就要思考如何寫出靈活適應(yīng)的代碼揭朝,來應(yīng)付只在一個顯示維度(高度或?qū)挾龋┥先」潭ㄖ刀蛹硪粋€顯示維度(寬度或高度)自適應(yīng)的多個長寬比不一致的圖像。
如果待展示的圖片都是本地圖片潭袱,這里有個常用的適配方案柱嫌。
首先我們用一種節(jié)省開銷的方式測量下待展示圖像的長寬值,有了長寬值屯换,長寬比自然也就有了:
val options: BitmapFactory.Options = BitmapFactory.Options()
options.inJustDecodeBounds = true//只測量待加載圖片编丘,不實際加載,從而節(jié)省開銷
BitmapFactory.decodeFile(path,options)//這里的 path 是一個已知的本地圖片存儲路徑 File對象
bmpWidth = options.outWidth.toFloat()//圖片寬度
bmpHeight = options.outHeight.toFloat()//圖片高度
有了待展示圖像的長寬比,我們只需根據(jù) ImageView 的固定高度(寬度)瘪吏,來計算出 ImageView 的適應(yīng)寬度(高度)癣防,并手動設(shè)置給 ImageView 的 layoutParams 即可(這里可能還需要把 ImageView 的scaleType 設(shè)置成 fitXY)。
目前來看掌眠,這種思路是能夠滿足我們需求的蕾盯。但是,如果待展示的圖像是網(wǎng)絡(luò)圖片呢蓝丙?這時候上面的方法似乎已經(jīng)不適用了级遭!
好啦我就不賣關(guān)子了,直接給出我的實現(xiàn)方法渺尘,非常的簡潔直觀:
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:adjustViewBounds="true"
android:background="@color/transparent"
tools:src="@drawable/test"/>
重點(diǎn)看這兩行代碼:
android:scaleType="fitXY"
android:adjustViewBounds="true"
單純設(shè)置 ImageView 的 scaleType 為 fitXY總免不了圖像會被拉伸挫鸽,使原本的長寬比被破壞。而設(shè)置 adjustViewBounds 為 true 則可以使 ImageView 在展示待展示圖像時保持待展示圖像的長寬比鸥跟。
是的丢郊,只需這兩行代碼搭配就能完美滿足我們的上述需求。
還有注意這個 ImageView 的寬高医咨,分別是:
android:layout_width="wrap_content"
android:layout_height="match_parent"
嗯也就是高度固定寬度隨圖像大小自適應(yīng)枫匾。
完。