1. 程式人生 > >利用約束佈局ConstraintLayout實現全適配九宮格

利用約束佈局ConstraintLayout實現全適配九宮格

android五花八門品類眾多尺寸各異的螢幕,一直是產品經驗和開發人員的心中難以解開的疙瘩,畫素,DP,英寸各種的不方便。面對競爭激烈的APP市場,介面平庸了不出容易出彩,介面特殊了又會帶來適配方面的難題。如何解決開發人員心中的痛,也是谷歌安卓團隊繞不開的坑。借鑑網頁開發的優點,早期已經有很多高手把百分比引入佈局,但是需要做大量的運算,介面越複雜,運算量越大,這無疑疑會帶來效能上的下降,從而影響體驗。直到後來谷哥終於也推出了自己的百分比佈局。

Google早期官方提供的百分比佈局庫,包含PercentFrameLayoutPercentRelativeLayout。version 24.1.0引入,version 26.1.0被棄用(真的短命)。

後來在2016年的Google I/O大會上 , Google 釋出了Android Studio 2.2預覽版,同時也釋出了Android 新的佈局方案 ConstraintLayout , 但是最近的一年也沒有大規模的使用。2017年Google釋出了 Android Studio 2.3 正式版,在 Android Studio 2.3 版本中新建的Module中預設的佈局就是 ConstraintLayout 。除了具有RelativeLayout的各種優點外,還具有大量獨特的屬性,對其內控制元件有諸如位置百比比,大小百分比,寬高百分比等一系列屬性。

這裡利於ConstraintLayout開發一個特殊的九宮格遊戲,九宮格需要在不同螢幕下都保持每個單元正方形,即寬高一比一,橫3豎3.這在以前佈局不寫程式碼無法做到,我不知道佈局時的屏寬,沒有辦法根據屏寬取三等份的寬和高,這裡我只要設定寬高1:1,三個控制元件平分屏寬就可以實現。如下

程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context=".XiaoChengActivity"
    tools:layout_editor_absoluteY="81dp">

    <TextView
        android:id="@+id/t1"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp"
        android:background="@android:color/holo_green_light"
        android:singleLine="false"
        android:textColor="@android:color/holo_red_light"
        android:textSize="10sp"
        app:layout_constrainedWidth="true"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintHorizontal_chainStyle="spread_inside"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/t2"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_percent="0.3"
        app:srcCompat="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/t2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="16dp"
        android:background="@android:color/holo_green_light"
        android:singleLine="false"
        android:textColor="@android:color/holo_red_light"
        android:textSize="10sp"
        app:fontFamily="sans-serif"
        app:layout_constrainedWidth="true"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintHorizontal_chainStyle="spread_inside"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintLeft_toRightOf="@id/t1"
        app:layout_constraintRight_toLeftOf="@id/t3"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_percent="0.3"
        app:srcCompat="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/t3"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginRight="16dp"
        android:layout_marginTop="16dp"
        android:background="@android:color/holo_green_light"
        android:singleLine="false"
        android:textColor="@android:color/holo_red_light"
        android:textSize="10sp"
        app:fontFamily="sans-serif"
        app:layout_constrainedWidth="true"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintHorizontal_chainStyle="spread_inside"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintLeft_toRightOf="@id/t2"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_percent="0.3"
        app:srcCompat="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/t4"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="2dp"
        android:background="@android:color/holo_green_light"
        android:textColor="@android:color/holo_red_light"
        android:textSize="10sp"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintLeft_toLeftOf="@+id/t1"
        app:layout_constraintRight_toRightOf="@+id/t1"
        app:layout_constraintTop_toBottomOf="@+id/t1"
        app:layout_constraintWidth_percent="0.3" />

    <TextView
        android:id="@+id/t5"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="2dp"
        android:background="@android:color/holo_green_light"
        android:textColor="@android:color/holo_red_light"
        android:textSize="10sp"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintLeft_toLeftOf="@+id/t2"
        app:layout_constraintRight_toRightOf="@+id/t2"
        app:layout_constraintTop_toBottomOf="@+id/t2"
        app:layout_constraintWidth_percent="0.3" />

    <TextView
        android:id="@+id/t6"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="2dp"
        android:background="@android:color/holo_green_light"
        android:textColor="@android:color/holo_red_light"
        android:textSize="10sp"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintLeft_toLeftOf="@+id/t3"
        app:layout_constraintRight_toRightOf="@+id/t3"
        app:layout_constraintTop_toBottomOf="@+id/t3"
        app:layout_constraintWidth_percent="0.3" />

    <TextView
        android:id="@+id/t7"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="2dp"
        android:background="@android:color/holo_green_light"
        android:textColor="@android:color/holo_red_light"
        android:textSize="10sp"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintLeft_toLeftOf="@+id/t4"
        app:layout_constraintRight_toRightOf="@+id/t4"
        app:layout_constraintTop_toBottomOf="@+id/t4"
        app:layout_constraintWidth_percent="0.3" />

    <TextView
        android:id="@+id/t8"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="2dp"
        android:background="@android:color/holo_green_light"
        android:textColor="@android:color/holo_red_light"
        android:textSize="10sp"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintLeft_toLeftOf="@+id/t5"
        app:layout_constraintRight_toRightOf="@+id/t5"
        app:layout_constraintTop_toBottomOf="@+id/t5"
        app:layout_constraintWidth_percent="0.3" />

    <TextView
        android:id="@+id/t9"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="2dp"
        android:background="@android:color/holo_green_light"
        android:textColor="@android:color/holo_red_light"
        android:textSize="10sp"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintLeft_toLeftOf="@+id/t6"
        app:layout_constraintRight_toRightOf="@+id/t6"
        app:layout_constraintTop_toBottomOf="@+id/t6"
        app:layout_constraintWidth_percent="0.3" />
</android.support.constraint.ConstraintLayout>