[译]正确获取约束 - ConstraintLayout

正确获取约束 - ConstraintLayout
原文链接:https://proandroiddev.com/getting-your-constraints-right-constraintlayout-786254ed1166

Constraintlayout文档描述:

一个ConstraintLayout是一个ViewGroup,它允许以灵活的方式调整组件的位置和大小。

这里的关键字是灵活性。这种灵活性可用于构建可扩展响应式用户界面。一个XML在所有屏幕尺寸和设备类型上都可以完美展示。

顾名思义,ConstraintLayout可以处理定义的一组约束。 如何定义这些约束条件,事实上决定了布局将变得多么灵活。

为了说明这一点,我们尝试构建超级天才设计师X先生为我们提供的UI设计。

设计稿

看起来很简单,对!

这种设计需要转换成一系列约束条件,这是你我进入的地方。

就我们的目的而言,需要关心的只是蓝图,而不是实际的设计资产:

设计蓝图

能够实现这种布局的一些方式可能是:

“NOOB”方式:

绝对质朴的做法是指定每个元素的精确X和Y坐标。这可能在一台设备上工作,但肯定不会适配不同的屏幕尺寸。所以这种方法带有“不要在家里试用”的免责声明。

“我爱我的父母”方式:

查看约束的另一种方法是视图与其父项的关系。让我们看看如果遵循相对于其父项约束每个视图的策略,那么约束条件可能会是什么情况。

相对父控件的视图显示

<?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"
    android:padding="16dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/titleTextView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="96dp"
        android:layout_marginTop="12dp"
        android:gravity="center"
        android:textAlignment="center"
        android:maxLines="1"
        android:textSize="18sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Team A vs Team B" />

    <ImageView
        android:id="@+id/teamALogo"
        android:layout_width="60dp"
        android:layout_height="80dp"
        android:layout_marginTop="44dp"
        tools:src="@tools:sample/avatars"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/teamBLogo"
        android:layout_width="60dp"
        android:layout_height="80dp"
        android:layout_marginTop="44dp"
        tools:src="@tools:sample/avatars"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/teamAScoreTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="80dp"
        android:layout_marginTop="75dp"
        android:padding="10dp"
        android:textAlignment="center"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="3" />

    <TextView
        android:id="@+id/teamBScoreTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="75dp"
        android:layout_marginEnd="80dp"
        android:padding="10dp"
        android:textAlignment="center"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="2" />

    <TextView
        android:id="@+id/teamScoreSeparatorTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="160dp"
        android:layout_marginTop="75dp"
        android:padding="10dp"
        android:textAlignment="center"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text=":" />

    <TextView
        android:id="@+id/teamANameTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="60dp"
        android:layout_marginTop="135dp"
        android:textAlignment="center"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Team Name" />

    <TextView
        android:id="@+id/teamBNameTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="135dp"
        android:layout_marginEnd="60dp"
        android:textAlignment="center"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Team Name" />

</android.support.constraint.ConstraintLayout>

在这种情况下,一切看起来都不错,但直到水平方向父母聚在一起时(父母分居确实对孩子有不良影响,对)。以下是横向模式下的相同布局:

随着横向差距的增加,子视图不再居中对齐,现在布局看起来不像设计师期望的那样。事实证明,仅依靠父布局并不是一个好主意。

“兄弟情”的方式:

同样,可以将所有视图放在一个或多个兄弟视图中。这里再一次,问题会和前面的情况一样。随着屏幕尺寸的增加或减少,视图之间的距离不会增加或减少。

“灵活”的方式

提出一套很好的约束条件的技巧是使用自适应约束。根据父视图大小的百分比定义约束条件通常是一个很好的起点。可以帮助您实现这一目标的工具是指导方针,链条和新引入的障碍。从标题开始,让我们找出哪些约束条件可以用于响应式用户界面:

1. titleTextView:

  • 标题宽度应该与父布局一样,中心文字对齐
  • 起终边距相等
  • 从顶部,可以使用水平对齐,大致将它放置在父视图高度的20%处

这三个限制对titleTextView就够了。

2. teamLogo, teamScoreTextView (A队和B队):

  • 这些视图具有共同的属性:水平中心对齐。为了达到这个目的,可以在屏幕中间添加一个垂直指引线,并在其左侧和右侧添加视图。
  • scoreView和teamLogoView可以放置在相同的距离,覆盖各自的一半屏幕。这可以使用分散模式下的链来实现。
  • 在垂直方向上,这些视图在其父项中居中对齐。

3. teamNameTextView:

  • 球队名称在球队得分下边。这给了垂直方向的限制。可以添加20dp的顶部边距。
  • 对于水平对齐,同时约束得分文本视图的开始和结束,以保持其与中心对齐w.r.t得分。

4. scoreSeparatorView:

  • 该视图可以同时水平和垂直居中对齐。

此时,布局具有相当的可扩展性和响应能力。最终的结果:

<?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="200dp"
    tools:context=".MainActivity">

    <android.support.constraint.Guideline
        android:id="@+id/titleTextViewGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="0dp"
        app:layout_constraintGuide_percent=".2" />

    <android.support.constraint.Guideline
        android:id="@+id/horizontalCenterGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="0dp"
        app:layout_constraintGuide_percent=".5" />

    <android.support.constraint.Guideline
        android:id="@+id/verticalCenterGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_begin="0dp"
        app:layout_constraintGuide_percent=".5" />


    <TextView
        android:id="@+id/titleTextView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="20dp"
        android:gravity="center"
        android:maxLines="1"
        android:textAlignment="center"
        android:textSize="18sp"
        app:layout_constraintBottom_toTopOf="@id/titleTextViewGuideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        tools:text="Team A vs Team B" />

    <ImageView
        android:id="@+id/teamALogo"
        android:layout_width="60dp"
        android:layout_height="80dp"
        app:layout_constraintBottom_toBottomOf="@id/horizontalCenterGuideline"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintEnd_toStartOf="@id/teamAScoreTextView"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/horizontalCenterGuideline"
        tools:src="@tools:sample/avatars" />

    <TextView
        android:id="@+id/teamAScoreTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textAlignment="center"
        app:layout_constraintBottom_toBottomOf="@id/horizontalCenterGuideline"
        app:layout_constraintEnd_toStartOf="@id/verticalCenterGuideline"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintStart_toEndOf="@id/teamALogo"
        app:layout_constraintTop_toTopOf="@id/horizontalCenterGuideline"
        tools:text="3" />

    <ImageView
        android:id="@+id/teamBLogo"
        android:layout_width="60dp"
        android:layout_height="80dp"
        app:layout_constraintBottom_toBottomOf="@id/horizontalCenterGuideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintStart_toEndOf="@id/teamBScoreTextView"
        app:layout_constraintTop_toTopOf="@id/horizontalCenterGuideline"
        tools:src="@tools:sample/avatars" />

    <TextView
        android:id="@+id/teamBScoreTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textAlignment="center"
        app:layout_constraintBottom_toBottomOf="@id/horizontalCenterGuideline"
        app:layout_constraintEnd_toStartOf="@id/teamBLogo"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintStart_toEndOf="@id/verticalCenterGuideline"
        app:layout_constraintStart_toStartOf="@id/verticalCenterGuideline"
        app:layout_constraintTop_toTopOf="@id/horizontalCenterGuideline"
        tools:text="3" />

    <TextView
        android:id="@+id/teamScoreSeparatorTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textAlignment="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text=":" />

    <TextView
        android:id="@+id/teamANameTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        app:layout_constraintTop_toBottomOf="@id/teamAScoreTextView"
        android:layout_marginTop="20dp"
        app:layout_constraintStart_toStartOf="@id/teamAScoreTextView"
        app:layout_constraintEnd_toEndOf="@id/teamAScoreTextView"
        tools:text="Team Name" />

    <TextView
        android:id="@+id/teamBNameTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        app:layout_constraintTop_toBottomOf="@id/teamBScoreTextView"
        android:layout_marginTop="20dp"
        app:layout_constraintStart_toStartOf="@id/teamBScoreTextView"
        app:layout_constraintEnd_toEndOf="@id/teamBScoreTextView"
        tools:text="Team Name" />

</android.support.constraint.ConstraintLayout>

垂直方式

水平方式

不是很糟糕,嗯?!

“更细的细节”

解决几个问题就可以使用户界面变成真正的响应式。

视图缩放:

如果查看横向界面,与纵向界面相比,有更多空白区域。这是因为视图定位是响应的,视图大小却不是。

例如,teamLogo图片横向和纵向界面都是是60dp x 80dp。可以让视图随着屏幕尺寸进行缩放来解决这个问题。让我们看看如何做到的

  • 对于所有视图:
    ConstraintLayout允许使用用百分比来指定大小,不是用dp指定高度和宽度。这告诉系统特定视图占用的宽度或高度的百分比。使得视图与屏幕尺寸成比例。

  • 附加的,对于TextViews:支持库最近引入了AutoSize TextViews,其中我们可以指定最大和最小字体大小。根据可用区域,系统会在适合的约束范围内选择最大的字体大小。

<?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="match_parent"
    tools:showIn="@layout/activity_main">

    <android.support.constraint.Guideline
        android:id="@+id/titleTextViewGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="0dp"
        app:layout_constraintGuide_percent=".2" />

    <android.support.constraint.Guideline
        android:id="@+id/horizontalCenterGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="0dp"
        app:layout_constraintGuide_percent=".5" />

    <android.support.constraint.Guideline
        android:id="@+id/verticalCenterGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_begin="0dp"
        app:layout_constraintGuide_percent=".5" />


    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/titleTextView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="20dp"
        android:gravity="center"
        android:maxLines="1"
        android:textAlignment="center"
        app:autoSizeMaxTextSize="24sp"
        app:autoSizeMinTextSize="18sp"
        app:autoSizeTextType="uniform"
        app:layout_constraintBottom_toBottomOf="@id/titleTextViewGuideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Team A vs Team B" />

    <ImageView
        android:id="@+id/teamALogo"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="@id/horizontalCenterGuideline"
        app:layout_constraintDimensionRatio="3:4"
        app:layout_constraintEnd_toStartOf="@id/teamAScoreTextView"
        app:layout_constraintHeight_percent=".6"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/horizontalCenterGuideline"
        tools:src="@tools:sample/avatars" />

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/teamAScoreTextView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textAlignment="center"
        app:autoSizeMaxTextSize="24sp"
        app:autoSizeMinTextSize="12sp"
        app:autoSizeTextType="uniform"
        app:layout_constraintBottom_toBottomOf="@id/horizontalCenterGuideline"
        app:layout_constraintEnd_toStartOf="@id/verticalCenterGuideline"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintStart_toEndOf="@id/teamALogo"
        app:layout_constraintTop_toTopOf="@id/horizontalCenterGuideline"
        tools:text="3" />

    <ImageView
        android:id="@+id/teamBLogo"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="@id/horizontalCenterGuideline"
        app:layout_constraintDimensionRatio="3:4"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_percent=".6"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintStart_toEndOf="@id/teamBScoreTextView"
        app:layout_constraintTop_toTopOf="@id/horizontalCenterGuideline"
        tools:src="@tools:sample/avatars" />

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/teamBScoreTextView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textAlignment="center"
        app:autoSizeMaxTextSize="24sp"
        app:autoSizeMinTextSize="12sp"
        app:autoSizeTextType="uniform"
        app:layout_constraintBottom_toBottomOf="@id/horizontalCenterGuideline"
        app:layout_constraintEnd_toStartOf="@id/teamBLogo"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintStart_toEndOf="@id/verticalCenterGuideline"
        app:layout_constraintStart_toStartOf="@id/verticalCenterGuideline"
        app:layout_constraintTop_toTopOf="@id/horizontalCenterGuideline"
        tools:text="3" />

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/teamScoreSeparatorTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textAlignment="center"
        app:autoSizeMaxTextSize="24sp"
        app:autoSizeMinTextSize="12sp"
        app:autoSizeTextType="uniform"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text=":" />

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/teamANameTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:textAlignment="center"
        app:autoSizeMaxTextSize="24sp"
        app:autoSizeMinTextSize="12sp"
        app:autoSizeTextType="uniform"
        app:layout_constraintEnd_toEndOf="@id/teamAScoreTextView"
        app:layout_constraintStart_toStartOf="@id/teamAScoreTextView"
        app:layout_constraintTop_toBottomOf="@id/teamAScoreTextView"
        tools:text="Team Name" />

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/teamBNameTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:textAlignment="center"
        app:autoSizeMaxTextSize="24sp"
        app:autoSizeMinTextSize="12sp"
        app:autoSizeTextType="uniform"
        app:layout_constraintEnd_toEndOf="@id/teamBScoreTextView"
        app:layout_constraintStart_toStartOf="@id/teamBScoreTextView"
        app:layout_constraintTop_toBottomOf="@id/teamBScoreTextView"
        tools:text="Team Name" />

</android.support.constraint.ConstraintLayout>

以下显示此视图在不同设备上的外观的屏幕截图。一个80dp x 60dp的固定大小的TextView作为参考。

这里的另一个问题是如何定位teamNameTextView。如果查看它的约束条件,它被放置在scoreTextView下方20dp处,并且相对于scoreTextView水平居中。

首先,如果团队名称足够长,TextView最终将与团队徽标或相反的团队teamNameTextView合并。其次,20dp也不可扩展。

解决第二个问题是将20dp转换为视图高度百分比的一个简单情况。它是第一个需要更多关注的问题。

为了解决这个问题,需要将teamNameTextView作为包含teamLogo和teamScoreTextView的链的一部分,以便在扩展视图时将其考虑在内。

<?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="240dp"
    android:padding="8dp">

    <android.support.constraint.Guideline
        android:id="@+id/titleTextViewGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="0dp"
        app:layout_constraintGuide_percent=".2" />

    <android.support.constraint.Guideline
        android:id="@+id/horizontalCenterGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="0dp"
        app:layout_constraintGuide_percent=".5" />

    <android.support.constraint.Guideline
        android:id="@+id/verticalCenterGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_begin="0dp"
        app:layout_constraintGuide_percent=".5" />

    <android.support.constraint.Guideline
        android:id="@+id/teamNameTextViewGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="0dp"
        app:layout_constraintGuide_percent=".7" />


    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/titleTextView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="20dp"
        android:gravity="center"
        android:maxLines="1"
        android:textAlignment="center"
        app:autoSizeMaxTextSize="24sp"
        app:autoSizeMinTextSize="18sp"
        app:autoSizeTextType="uniform"
        app:layout_constraintBottom_toBottomOf="@id/titleTextViewGuideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Team A vs Team B" />

    <ImageView
        android:id="@+id/teamALogo"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="@id/horizontalCenterGuideline"
        app:layout_constraintDimensionRatio="3:4"
        app:layout_constraintEnd_toStartOf="@id/teamANameTextView"
        app:layout_constraintHeight_percent=".5"
        app:layout_constraintHorizontal_chainStyle="spread"
        android:scaleType="centerInside"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/horizontalCenterGuideline"
        tools:src="@tools:sample/avatars" />

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/teamAScoreTextView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textAlignment="center"
        app:autoSizeMaxTextSize="24sp"
        app:autoSizeMinTextSize="12sp"
        app:autoSizeTextType="uniform"
        app:layout_constraintBottom_toBottomOf="@id/horizontalCenterGuideline"
        app:layout_constraintStart_toStartOf="@id/teamANameTextView"
        app:layout_constraintEnd_toEndOf="@id/teamANameTextView"
        app:layout_constraintTop_toTopOf="@id/horizontalCenterGuideline"
        tools:text="3" />

    <ImageView
        android:id="@+id/teamBLogo"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="@id/horizontalCenterGuideline"
        app:layout_constraintDimensionRatio="3:4"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_percent=".5"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintStart_toEndOf="@id/teamBNameTextView"
        app:layout_constraintTop_toTopOf="@id/horizontalCenterGuideline"
        tools:src="@tools:sample/avatars" />

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/teamBScoreTextView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textAlignment="center"
        app:autoSizeMaxTextSize="24sp"
        app:autoSizeMinTextSize="12sp"
        app:autoSizeTextType="uniform"
        app:layout_constraintBottom_toBottomOf="@id/horizontalCenterGuideline"
        app:layout_constraintEnd_toStartOf="@id/teamBLogo"
        app:layout_constraintStart_toStartOf="@id/teamBNameTextView"
        app:layout_constraintEnd_toEndOf="@id/teamBNameTextView"
        app:layout_constraintTop_toTopOf="@id/horizontalCenterGuideline"
        tools:text="3" />

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/teamScoreSeparatorTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textAlignment="center"
        app:autoSizeMaxTextSize="24sp"
        app:autoSizeMinTextSize="12sp"
        app:autoSizeTextType="uniform"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@id/teamANameTextView"
        app:layout_constraintEnd_toStartOf="@id/teamBNameTextView"
        app:layout_constraintTop_toTopOf="parent"
        tools:text=":" />

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/teamANameTextView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:textAlignment="center"
        app:autoSizeMaxTextSize="24sp"
        app:autoSizeMinTextSize="12sp"
        app:autoSizeTextType="uniform"
        app:layout_constraintEnd_toStartOf="@id/teamScoreSeparatorTextView"
        app:layout_constraintStart_toEndOf="@id/teamALogo"
        app:layout_constraintTop_toBottomOf="@id/teamNameTextViewGuideline"
        tools:text="Large Team Name" />

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/teamBNameTextView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:textAlignment="center"
        app:autoSizeMaxTextSize="24sp"
        app:autoSizeMinTextSize="12sp"
        app:autoSizeTextType="uniform"
        app:layout_constraintEnd_toStartOf="@id/teamBLogo"
        app:layout_constraintStart_toEndOf="@id/teamScoreSeparatorTextView"
        app:layout_constraintTop_toBottomOf="@id/teamNameTextViewGuideline"
        tools:text="Team Name" />

</android.support.constraint.ConstraintLayout>

完成这些修改后,获得UI的最终版本?

如果你感觉像现代Android开发者一样强大得多,请拍手(并在此帖子上)。ConstraintLayout是一个包含许多有用工具的工具箱。通过一些练习,您将拥有一套合适的工具来创建漂亮灵活的用户界面。让Android一起成为更美丽的地方。

猜你喜欢

转载自blog.csdn.net/lihenair/article/details/80800831
今日推荐