国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ConstraintLayout 介紹與實戰(zhàn)

番茄西紅柿 / 2649人閱讀

摘要:比如讓在父容器中左右居中豎直居中同理。相對圓周定位屬性在版本中添加,提供開發(fā)者相對控件的中心一個角度和距離上約束另外一個控件的能力。是約束布局用來控制一組控件的可見性。被引用的控件的可見性和深度屬性與相同。

介紹

ConstraintLayout 在 2016 年 Google IO 中面世,它的出現(xiàn)是為了解決開發(fā)中過于復雜的頁面層級嵌套過多的問題——層級過深會增加繪制界面需要的時間,影響用戶體驗。

在使用過程中,ConstraintLayout 可以看做是一個更強大的 RelativeLayout,它提供了更多的 API 來約束控件的相對關系,更容易滿足復雜的頁面布局。

布局屬性

約束布局擁有更強大的約束能力,其擁有的布局屬性數(shù)量也非常多,筆者在這里進行分類講解。

相對定位屬性

相對定位是約束布局中創(chuàng)建布局的基本屬性之一。這些屬性和 RelativeLayout 布局屬性是類似的,用來控制控件相對于另外一個控件或者父容器的位置。

分別可以在水平軸和垂直軸上約束控件:

Horizontal: left, right, start, end

Vertical: top, bottom, text baseline

簡單來說就是將給定一側需要約束的控件約束到另一個控件的另一側。 舉個例子,把按鈕 B 放到按鈕 A 的右邊:

我們可以這樣寫:

<Button android:id="@+id/buttonA" ... />
<Button android:id="@+id/buttonB" ...
app:layout_constraintLeft_toRightOf="@+id/buttonA" />

除了指定另外一個控件 id 進行約束,我們還可以與父布局進行約束:

<Button android:id="@+id/buttonB" ...
app:layout_constraintLeft_toLeftOf="parent" />
Margins

設置控件的間距屬性與其他布局相同,但約束布局中對應間距值生效需要有對應的約束條件,比如需要給控件設置左間距,那該控件它的 constraint_toXXXOf 一定需要,否則間距無法生效。

與其他控件不同的是新增了一系列 goneMargin 屬性,用來控制當約束目標可見性為 GONE 的時候,設置不同的間距值。

實踐過程中筆者能夠想到的一個場景需求是:

在動畫中,A 不可見的時候,需要保證 B 的布局位置不變,這個時候設置 goneMarginStart 的值為 A 的寬度加上 B 的 marginStart ,就可以滿足該需求。

居中和 Bias

居中

跟其他布局一樣,約束布局同樣擁有子控件居中的能力,居中定位是以橫向/豎向兩端同時約束來定位布局位置。比如讓 A 在父容器中左右居中:

<android.support.constraint.ConstraintLayout ...>
  <Button android:id="@+id/button" ...
          app:layout_constraintLeft_toLeftOf="parent"
          app:layout_constraintRight_toRightOf="parent/>

豎直居中同理。

Bias

上述布局約束會把控件居中對齊,使用 bias 可以進行偏移。

layout_constraintHorizontal_bias

layout_constraintVertical_bias

如果沒有設置 bias 值,則左右兩邊取值各占有 50% 也就是居中的效果,如果把 bias 修改為 0.3 (30%),則左邊空白的邊距會減少,右邊會相應增多。

給上述代碼增加一行 app:layout_constraintHorizontal_bias="0.3" ,就可以得到圖片的效果。

<android.support.constraint.ConstraintLayout ...>
  <Button android:id="@+id/button" ...
          app:layout_constraintHorizontal_bias="0.3"
          app:layout_constraintLeft_toLeftOf="parent"
          app:layout_constraintRight_toRightOf="parent/>

相對圓周定位 (ver 1.1)

constraintCircle 屬性在 1.1 版本中添加,提供開發(fā)者相對控件的中心一個角度和距離上約束另外一個控件的能力。

layout_constraintCircle

layout_constraintCircleRadius

layout_constraintCircleAngle

<Button android:id="@+id/buttonA" ... />
<Button android:id="@+id/buttonB" ...
        app:layout_constraintCircle="@+id/buttonA"
        app:layout_constraintCircleRadius="100dp"
        app:layout_constraintCircleAngle="45" />
控件的尺寸約束

ConstraintLayout 中設置控件的高度和寬度是通過 android:layout_widthandroid:layout_height 來指定,但有三種不同類型:

    使用確定的尺寸,給定數(shù)值,比如 36dp

    使用 WRAP_CONTENT 該效果與其他控件相同

    使用 0dp 來表示 MATCH_CONSTRAINT, 意思是根據(jù)約束規(guī)則指定高寬

(a) 設置為 WRAP_CONTENT;(b) 設置為 0dp;(c) 是設置了 margin 情況下的 (b)

WRAP_CONTENT 下的強制約束 (ver 1.1)

在 1.1 版本之前,約束布局對于控件的 WRAP_CONTENT 是不會限制它的結果大小。所以這在你希望使用 WRAP_CONTENT 但仍然需要強制約束條件來限制它的結果,就可能需要添加以下屬性:

app:layout_constrainedWidth="true|false"

app:layout_constrainedHeight="true|false"

在最后業(yè)務實戰(zhàn)的第一個例子中會具體說明該屬性的使用場景

寬高比例

layout_constraintDimensionRatio 限制控件的寬高比,如果要使用寬高比來約束尺寸,則至少要設置寬高其中一個尺寸為0dp,然后再設置上 layout_constraintDimentionRatio 屬性。

<Button android:layout_width="wrap_content"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1" />

上述代碼會得到一個高度跟寬度相同的 Button。

關于比例的取值有兩種方式:

float 值,代表寬度/高度的比率

寬度:高度這種比率值,比如 9:16

如果寬高都是 MATCH_CONSTRAINT (0dp) 也可以是用寬高比,這種情況系統(tǒng)會使用滿足所有約束條件和寬高比率的最大尺寸。如果要根據(jù)其中一個尺寸來約束另外一個尺寸,可以在比率數(shù)值前添加 "W/H" 來分別約束寬度或者高度。 舉例:app:layout_constraintDimensionRatio="H,16:9"

這行代碼表示約束該 View 的高度,其數(shù)值需要符合 16:9 的比率。

鏈條

Chains 為同一個方向(水平或者垂直)上的多個控件提供一個類似群組的概念。其他的方向則可以多帶帶控制。

創(chuàng)建鏈條

多個控件相互在同一個方向上雙向引用就可以創(chuàng)建一個 Chain.

Chain Style

以下屬性是用來控制 Chain Style 的:

– layout_constraintHorizontal_chainStyle – layout_constraintHorizontal_weight – layout_constraintVertical_chainStyle – layout_constraintVertical_weight

其中 Style 有 4 種:

    CHAIN_SPREAD 這個是默認的 Style, 里面的所有控件會分散開布局

    Weighted chain,在 CHAIN_SPREAD 模式下,如果有些控件的尺寸設置為 MATCH_CONSTRAINT(0dp),則這些控件尺寸會占據(jù)所有剩余可用的空間,和 LinearLayout weight 類似。

    CHAIN_SPREAD_INSIDECHAIN_SPREAD 類似,只不過兩端的兩個控件和父容器直接不占用多余空間,多余空間在控件之間分散

    CHAIN_PACKED 這種模式下,所有的控件都居中聚集在一起,但是可以設置 bias 屬性來控制聚集的位置。

輔助布局

Guideline

Guideline 是約束布局中一個特殊的輔助布局類,可以創(chuàng)建水平或者垂直的參考線,其他的控件可以根據(jù)這個參考線來進行布局,它本質是不可見的控件。

參考線的位置屬性:

orientation:vertical/horizontal

layout_constraintGuide_begin 指定距離左/上邊開始的固定位置

layout_constraintGuide_end 指定距離右/下邊開始的固定位置

layout_constraintGuide_percent 指定位于布局中所在的百分比

Barrier

Barrier 在約束布局中通過 constraint_referenced_ids 引用多個控件,看作一個整體來添加一個與另外一個控件限制最大寬/高的約束。

通過 app:barrierDirection 屬性來決定 Barrier 的方向。

 <android.support.constraint.Barrier
          android:id="@+id/barrier"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          app:barrierDirection="start"
          app:constraint_referenced_ids="button1,button2" />

Group

Group 是約束布局用來控制一組控件的可見性。

<android.support.constraint.Group
    android:id="@+id/group"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="visible"
    app:constraint_referenced_ids="button4,button9" />

被引用 id 的控件的可見性(visibility)和深度(elevation)屬性與 Group 相同。

換句話說:被 Group 引用的控件會導致它們的自身的可見性和深度失效。

業(yè)務經典場景 1. 固定一邊,中間寬度可變,另一邊跟隨中間尾部

設計需求:頭像位置固定,中間文字長度可變,最右側按鈕跟在文字右側,但不能超出屏幕。

<androidx.constraintlayout.widget.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="60dp"
      tools:background="@color/background_gray">

      <ImageView
          android:id="@+id/iv_avatar"
          android:layout_width="40dp"
          android:layout_height="40dp"
          android:layout_marginStart="15dp"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintHorizontal_bias="0"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toTopOf="parent"
          tools:srcCompat="@tools:sample/avatars[2]" />

      <TextView
          android:id="@+id/tv_text"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginStart="15dp"
          android:layout_marginEnd="15dp"
          android:singleLine="true"
          app:layout_constrainedWidth="true"
          app:layout_constraintBottom_toBottomOf="@+id/iv_avatar"
          app:layout_constraintEnd_toStartOf="@id/tv_action"
          app:layout_constraintHorizontal_bias="0"
          app:layout_constraintHorizontal_chainStyle="packed"
          app:layout_constraintStart_toEndOf="@id/iv_avatar"
          app:layout_constraintTop_toTopOf="@+id/iv_avatar"
          tools:text="ConstraintLayout is available as a support library" />

      <TextView
          android:id="@+id/tv_action"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginEnd="15dp"
          app:layout_constraintBottom_toBottomOf="@+id/iv_avatar"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toEndOf="@id/tv_text"
          app:layout_constraintTop_toTopOf="@+id/iv_avatar"
          tools:text="查看" />


androidx.constraintlayout.widget.ConstraintLayout>

該場景重點需要熟悉屬性:layout_constrainedWidth/Height 應用。

2. 根據(jù)某個 View 的高度/寬度,來居中一組 View

設計需求:右側圖片和文字,需要整體跟左邊頭像居中。

<androidx.constraintlayout.widget.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="300dp"
    tools:background="@color/background_gray">

    <ImageView
        android:id="@+id/iv_avatar"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_marginStart="15dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.3"
        tools:srcCompat="@tools:sample/avatars[2]" />

    <ImageView
        android:id="@+id/iv_pic"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_marginStart="50dp"
        android:scaleType="centerCrop"
        app:layout_constraintBottom_toTopOf="@+id/tv_content"
        app:layout_constraintStart_toEndOf="@id/iv_avatar"
        app:layout_constraintTop_toTopOf="@id/iv_avatar"
        app:layout_constraintVertical_chainStyle="packed"
        tools:srcCompat="@tools:sample/backgrounds/scenic[6]" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        app:layout_constraintBottom_toBottomOf="@id/iv_avatar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="@id/iv_pic"
        app:layout_constraintTop_toBottomOf="@+id/iv_pic"
        tools:text="Chains provide group-like behavior in a single axis (horizontally or vertically). " />
androidx.constraintlayout.widget.ConstraintLayout>

該場景重點需要熟悉約束布局:Chain 的應用。 iv_pictv_content 雙向依賴,使用 packed Style 讓它們緊靠一起,同時,iv_pic 頭部與 iv_avatar 的頭部對齊, tv_content 的底部與 iv_avatar 的底部對齊,達到它們居中顯示的效果。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/7049.html

相關文章

  • 姿勢擺好,一招學會android的布局優(yōu)化!

    摘要:并且便于統(tǒng)一的修改與查看。一旦被顯示后,則將從視圖框架中移除,其也會失效,此時得到的也是空的。所以它可以有效的避免布局的嵌套,從而達到優(yōu)化布局的效果。其他嵌套的中,盡量不要使用,因為會重新測量兩次。 作為android應用來講,無論應用本身多么美觀,功能多么強大,內容多么豐富。但如果App本身打開界面緩慢超過手機16ms刷新一次頁面的時間,就會產生卡頓。用戶體驗都會變得極差,導致用戶量...

    lijy91 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<