ConstraintLayout视图大小 - 与父级的比例

8
我正在学习如何使用ConstraintLayout。我想制作一个包含4个元素的菜单。
  • 元素应该居中于父容器

  • 元素应该是父容器高度的1:5大小比例(1:1比例-正方形)

我已经做了类似于这样的东西:

enter image description here

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <android.support.constraint.Guideline
        android:id="@+id/split"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.6" />

    <android.support.constraint.ConstraintLayout
        android:id="@+id/tiles_container"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:background="@color/colorPrimary"
        app:layout_constraintBottom_toTopOf="@+id/split"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0">

        <android.support.constraint.Guideline
            android:id="@+id/container_v"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.5" />

        <android.support.constraint.Guideline
            android:id="@+id/container_h"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.5" />

        <ImageView
            android:id="@+id/tile_1"
            android:layout_width="@dimen/tile_size"
            android:layout_height="@dimen/tile_size"
            android:layout_marginBottom="@dimen/tile_margin"
            android:layout_marginEnd="@dimen/tile_margin"
            app:layout_constraintBottom_toTopOf="@+id/container_v"
            app:layout_constraintEnd_toStartOf="@+id/container_h"
            app:srcCompat="@mipmap/ic_launcher" />

        <ImageView
            android:id="@+id/tile_2"
            android:layout_width="@dimen/tile_size"
            android:layout_height="@dimen/tile_size"
            android:layout_marginBottom="@dimen/tile_margin"
            android:layout_marginStart="@dimen/tile_margin"
            app:layout_constraintBottom_toTopOf="@+id/container_v"
            app:layout_constraintStart_toStartOf="@+id/container_h"
            app:srcCompat="@mipmap/ic_launcher" />

        <ImageView
            android:id="@+id/tile_3"
            android:layout_width="@dimen/tile_size"
            android:layout_height="@dimen/tile_size"
            android:layout_marginTop="@dimen/tile_margin"
            android:layout_marginEnd="@dimen/tile_margin"
            app:layout_constraintEnd_toStartOf="@+id/container_h"
            app:layout_constraintTop_toTopOf="@+id/container_v"
            app:srcCompat="@mipmap/ic_launcher" />

        <ImageView
            android:id="@+id/tile_4"
            android:layout_width="@dimen/tile_size"
            android:layout_height="@dimen/tile_size"
            android:layout_marginTop="@dimen/tile_margin"
            android:layout_marginStart="@dimen/tile_margin"
            app:layout_constraintStart_toStartOf="@+id/container_h"
            app:layout_constraintTop_toTopOf="@+id/container_v"
            app:srcCompat="@mipmap/ic_launcher" />


    </android.support.constraint.ConstraintLayout>


</android.support.constraint.ConstraintLayout>

很遗憾,我不得不硬编码图像的宽度和高度。是否可能根据父元素的比例设置子元素的大小(就像在Xcode中一样)?

1个回答

13

不应将ConstraintLayout嵌套在另一个ConstraintLayout中,应始终保持平面布局层次结构。

ConstraintLayout的“1.1.0-beta3”版本允许使用百分比尺寸和许多其他酷炫的功能。

只需将“layout_constraintHeight_default”属性设置为“percent”(以使用百分比单位),并使用“layout_constraintHeight_percent”设置百分比即可。 (宽度相关属性也可用)

以下是使用Guidelines的解决方案:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#caf">

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

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

    <View
        android:id="@+id/topLeft"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_margin="4dp"
        android:background="#fff"
        app:layout_constraintBottom_toTopOf="@+id/guideline_hor"
        app:layout_constraintDimensionRatio="h,1:1"
        app:layout_constraintHeight_default="percent"
        app:layout_constraintHeight_percent=".2"
        app:layout_constraintRight_toLeftOf="@+id/guideline_ver" />

    <View
        android:id="@+id/topRight"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_margin="4dp"
        android:background="#fff"
        app:layout_constraintBottom_toTopOf="@+id/guideline_hor"
        app:layout_constraintDimensionRatio="h,1:1"
        app:layout_constraintHeight_default="percent"
        app:layout_constraintHeight_percent=".2"
        app:layout_constraintLeft_toRightOf="@+id/guideline_ver" />

    <View
        android:id="@+id/bottomLeft"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_margin="4dp"
        android:background="#fff"
        app:layout_constraintDimensionRatio="h,1:1"
        app:layout_constraintHeight_default="percent"
        app:layout_constraintHeight_percent=".2"
        app:layout_constraintRight_toLeftOf="@+id/guideline_ver"
        app:layout_constraintTop_toBottomOf="@+id/guideline_hor" />

    <View
        android:id="@+id/bottomRight"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_margin="4dp"
        android:background="#fff"
        app:layout_constraintDimensionRatio="h,1:1"
        app:layout_constraintHeight_default="percent"
        app:layout_constraintHeight_percent=".2"
        app:layout_constraintLeft_toRightOf="@+id/guideline_ver"
        app:layout_constraintTop_toBottomOf="@+id/guideline_hor" />

</android.support.constraint.ConstraintLayout>

布局截图

希望对您有所帮助!


实现 'com.android.support.constraint:constraint-layout:1.1.0-beta3' - Rami Jemli
“你不应该将ConstraintLayout嵌套在另一个ConstraintLayout中。” 你能解释一下为什么不能这样做吗?或者展示一下相关的文档吗?我不明白如果不这样做,如何创建更复杂的视图。 - datWooWoo
1
移动设备以60 fps刷新其显示屏幕,因此您的应用程序每帧有16毫秒来更新。如果一帧渲染超过该限制,它将被丢弃,您将看到LAG。嵌套布局比平面布局需要更多时间来呈现,这就是为什么它们对性能不利的原因。如果您嵌套使用RelativeLayout或使用weight的LinearLayout,则这两个每次呈现时都会调用onMesure两次。因此,如果我们具有平面布局层次结构,则速度要快得多。 - Rami Jemli
在我看来,使用1.0.2稳定版的约束布局确实无法避免嵌套布局。但是,我已经使用了1.1.0 beta版本很长时间,可以肯定地说,无论设计有多复杂,都可以实现扁平化布局层次结构。这个版本具有一些很棒的新功能,如障碍物、组、圆形定位、百分比尺寸和占位符等。试试看吧。 - Rami Jemli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接