RecyclerView<第七篇>:高度自適應(yīng)

很多時候,我們會發(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>

但是,運行效果卻是這樣的,如圖:

65.gif

圖片占滿整個屏幕了。

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

66.gif

那么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)的問題,如果您相信這句話真的就能解決問題的話,那就洗洗睡吧。

圖片.png

看到這張截圖了嗎,在高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> 
67.gif

如上圖,這就是固定圖片為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" />

效果如下:

68.gif

自定義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>

效果如下:

69.gif

【方法四】

【方法二】【方法三】都是在寬度固定的情況計算圖片高度的固定值,這些方案其實有其中的缺陷,那么需求要求圖片不變形展示該如何做呢?

有一個屬性也許需要您了解一下: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

聲明:

以上舉例暫時就這么多了,具體情況還要看需求,如果大家遇到困難可以給我留言。

[本章完...]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容