从ImageView的顶部限制为50%

时间:2018-10-29 16:34:50

标签: android android-constraintlayout

我的布局如下:

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/imageView4"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:scaleType="centerCrop"
            app:layout_constraintBottom_toBottomOf="@+id/textView5"
            app:layout_constraintDimensionRatio="1:1"
            app:layout_constraintTop_toTopOf="parent"
            tools:srcCompat="@tools:sample/backgrounds/scenic[1]" />

        <View
            android:id="@+id/view"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="@+id/imageView4"
            app:layout_constraintEnd_toEndOf="@+id/imageView4"
            app:layout_constraintStart_toStartOf="@+id/imageView4"
            app:layout_constraintTop_toTopOf="@+id/imageView4" />

        <TextView
            android:id="@+id/textView5"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Hello"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />

    </android.support.constraint.ConstraintLayout>

基本上,View覆盖在ImageView的顶部。但是,我需要View的顶部从ImageView的中点开始,即从ImageView的顶部开始50%。我该怎么做?

2 个答案:

答案 0 :(得分:2)

ConstraintLayout中的百分比约束仅与视图的父级相关。请参见documentation。但是,对于具有match_constraints的小部件,存在“加权链”的概念。参见here

  

加权链

     

链的默认行为是将元素平均分布在可用空间中。如果一个或多个元素正在使用MATCH_CONSTRAINT,则它们将使用可用的空白空间(在它们之间平均分配)。属性layout_constraintHorizo​​ntal_weight和layout_constraintVertical_weight将控制如何使用MATCH_CONSTRAINT在元素之间分配空间。例如,在包含两个使用MATCH_CONSTRAINT的元素的链上,第一个元素的权重为2,第二个元素的权重为1,第一个元素所占的空间将是第二个元素的两倍。

因此,您的XML应该看起来像以下结果。 (我为View的背景加上了颜色,因此可以看到它。

enter image description here

<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">

    <ImageView
        android:id="@+id/imageView4"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:scaleType="centerCrop"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:srcCompat="@tools:sample/backgrounds/scenic[1]" />

    <Space
        android:id="@+id/space"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:background="@android:color/holo_blue_light"
        app:layout_constraintBottom_toTopOf="@id/view"
        app:layout_constraintEnd_toEndOf="@id/imageView4"
        app:layout_constraintStart_toStartOf="@id/imageView4"
        app:layout_constraintTop_toTopOf="@id/imageView4"
        app:layout_constraintVertical_weight="1" />

    <View
        android:id="@+id/view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_red_light"
        app:layout_constraintBottom_toBottomOf="@+id/imageView4"
        app:layout_constraintEnd_toEndOf="@+id/imageView4"
        app:layout_constraintStart_toStartOf="@+id/imageView4"
        app:layout_constraintTop_toBottomOf="@+id/space"
        app:layout_constraintVertical_weight="1" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Hello"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</android.support.constraint.ConstraintLayout>

答案 1 :(得分:0)

由于ImageView是正方形,因此您也可以在此处使用尺寸比例属性。删除View的顶部约束以使其与底部对齐,并将width:height比率设置为H,2:1以根据宽度约束高度。

<View
    android:id="@+id/view"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintDimensionRatio="H,2:1"
    app:layout_constraintBottom_toBottomOf="@id/imageView4"
    app:layout_constraintEnd_toEndOf="@id/imageView4"
    app:layout_constraintStart_toStartOf="@id/imageView4" />