很多時候,我們會發(fā)現(xiàn),只要Item里面加入圖片就很容易出現(xiàn)圖片占滿整個屏幕的問題,為了解決這個問題,我將單獨拉出一篇文章來講解。
首先,看一下Recyclerview Item的布局,您可能會發(fā)現(xiàn)LinearLayout的高度是“wrap_content”,ImageView的高度也是“wrap_content”,也就是說,這個Item的高度是包裹內(nèi)容的。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="visible"
android:scaleType="centerCrop"
android:layout_gravity="center_horizontal" />
</LinearLayout>
但是,運行效果卻是這樣的,如圖:

圖片占滿整個屏幕了。
如果,您刪除android:scaleType="centerCrop"這句話會返現(xiàn),圖片沒有占滿整個屏幕,如圖:

那么scaleType是什么呢?為什么會影響圖片的Item的高度?
此時,您可能需要了解一下scaleType,請看這篇博客:Android ImageView 的scaleType 屬性圖解
看完之后,您就會恍然大物語,原來圖片占滿整個屏幕和圖片加載的scaleType有關(guān)啊。
有些scaleType需要ImageView容器固定寬高才能設(shè)置,比如centerCrop。
scaleType有很多種,根據(jù)不同的需求,選擇對應(yīng)的值,本文不關(guān)心scaleType哪些數(shù)據(jù)需要高度自適應(yīng),本文關(guān)心的是,如果一旦遇到圖片全屏的情況,Recyclerview的Item該怎么自適應(yīng)?
下面開始描述各種解決方案,您可以根據(jù)需求自主選擇最適合的一個方法。
【方法一】
查了一下網(wǎng)上的資料,有人說設(shè)置setAutoMeasureEnabled為true可以解決高度自適應(yīng)的問題,如果您相信這句話真的就能解決問題的話,那就洗洗睡吧。

看到這張截圖了嗎,在高SDK版本中,setAutoMeasureEnabled已被棄用。
因此,方法一不可取。
【方法二】
比較容易想到的辦法就是固定圖片高度
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="300dp"
android:visibility="visible"
android:scaleType="centerCrop"
android:layout_gravity="center_horizontal" />
</LinearLayout>

如上圖,這就是固定圖片為300dp的效果,但是Android手機(jī)的屏幕大小不一,有些手機(jī)的效果看起來有點怪異,那么如果讓圖片寬高等比,這樣不管什么手機(jī)效果都很好了吧。
下面,我來寫一個自定義ImageView,來實現(xiàn)圖片寬高等比的效果。
public class MyImageView extends AppCompatImageView {
public MyImageView(Context context) {
this(context, null);
}
public MyImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}
}
為了方便查看效果,左右兩邊都縮進(jìn)的100dp
<com.xxx.ooo.recycleview.MyImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="100dp"
android:layout_marginRight="100dp"
android:visibility="visible"
android:scaleType="centerCrop"
android:layout_gravity="center_horizontal" />
效果如下:

自定義ImageView是不是很簡單,只需要把
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
改成
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
即可。
這里需要說明的是,onMeasure是自定義view三大方法之一,onMeasure負(fù)責(zé)布局的測量工作,所以如果需要調(diào)整布局,那么就在這個方法里面調(diào)整即可。
【方法三】
固定圖片父布局高度同樣可以實現(xiàn)。
public class MyLinearLayout extends LinearLayout {
public MyLinearLayout(Context context) {
this(context, null);
}
public MyLinearLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public MyLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}
}
<?xml version="1.0" encoding="utf-8"?>
<com.xxx.ooo.recycleview.MyLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="visible"
android:scaleType="centerCrop"
android:layout_gravity="center_horizontal" />
</com.xxx.ooo.recycleview.MyLinearLayout>
效果如下:

【方法四】
【方法二】和【方法三】都是在寬度固定的情況計算圖片高度的固定值,這些方案其實有其中的缺陷,那么需求要求圖片不變形展示該如何做呢?
有一個屬性也許需要您了解一下:adjustViewBounds
<ImageView
android:id="@+id/iv_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"/>
將adjustViewBounds設(shè)置為true也許就會達(dá)到圖片寬度和高度自適應(yīng)。
以下資料我在網(wǎng)上找的,您可以了解一下:
【Android】ImageView一個值得注意的屬性adjustViewBounds
聲明:
以上舉例暫時就這么多了,具體情況還要看需求,如果大家遇到困難可以給我留言。
[本章完...]