在约束布局中的按钮上重叠图像视图

Posted

技术标签:

【中文标题】在约束布局中的按钮上重叠图像视图【英文标题】:Overlap an image view on button in a constraint layout 【发布时间】:2021-12-26 17:08:50 【问题描述】:

我想设计一种布局,它的侧面有一个图像视图,但与按钮重叠。我必须在约束布局中这样做。 谁能建议一种方法来实现这一点? 提前致谢。

附下设计图:design needed

编辑:我尝试了第二个答案告诉我的方法。但是,图像仍然被按钮隐藏。那么任何人都可以建议一种使图像在按钮顶部可见的方法吗?

Login screen

登录布局

<layout>

    <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_
        android:layout_
        android:background="@color/colorAccent"
        tools:context=".MainActivity">

        <View
            android:id="@+id/view_form"
            android:layout_
            android:layout_
            android:layout_marginTop="@dimen/marginTopLogin"
            android:background="@drawable/round_cornered_top_white_bg_drawable"
            app:layout_constraintBottom_toBottomOf="@+id/btnSubmit"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="1.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/etUsername"
            app:layout_constraintVertical_weight="0.50" />


        <EditText
            android:id="@+id/etUsername"
            android:layout_
            android:layout_
            android:layout_margin="20dp"
            android:autofillHints="name"
            android:hint="Username"
            android:imeOptions="actionNext"
            android:inputType="text"
            android:maxLines="1"
            android:padding="16dp"
            app:layout_constraintEnd_toEndOf="@id/view_form"
            app:layout_constraintStart_toStartOf="@id/view_form"
            app:layout_constraintBottom_toTopOf="@id/etPassword" />

        <EditText
            android:id="@+id/etPassword"
            android:layout_
            android:layout_
            android:layout_margin="20dp"
            android:autofillHints="password"
            android:hint="Password"
            android:imeOptions="actionDone"
            android:inputType="textPassword"
            android:maxLines="1"
            android:padding="16dp"
            app:layout_constraintEnd_toEndOf="@id/view_form"
            app:layout_constraintStart_toStartOf="@id/view_form"
            app:layout_constraintBottom_toTopOf="@+id/btnSubmit" />

        <CheckBox
            android:id="@+id/imgTogglePassword"
            android:layout_
            android:layout_
            android:layout_marginTop="-5dp"
            android:layout_marginEnd="-5dp"
            android:button="@drawable/btn_toggle_password"
            android:padding="16dp"
            app:layout_constraintBottom_toBottomOf="@id/etPassword"
            app:layout_constraintEnd_toEndOf="@id/etPassword"
            app:layout_constraintTop_toTopOf="@id/etPassword" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/btnSubmit"
            android:layout_
            android:layout_
            android:layout_marginBottom="20dp"
            android:layout_marginStart="20dp"
            android:layout_marginEnd="20dp"
            android:textColor="@color/colorWhite"
            android:text="Submit"
            android:background="@color/purple_700"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent" />

        <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/imgNext"
            android:layout_
            android:layout_
            app:srcCompat="@drawable/ic_ico_gonext"
            android:padding="16dp"
            android:layout_marginEnd="20dp"
            app:layout_constraintTop_toTopOf="@id/btnSubmit"
            app:layout_constraintBottom_toBottomOf="@id/btnSubmit"
            app:layout_constraintEnd_toEndOf="parent"/>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

【问题讨论】:

【参考方案1】:

您可以将ImageView 的顶部和底部约束设置为Button 的顶部和底部(基本上垂直居中),end 约束(或right,如果它是特别是始终在右侧,即使在 RTL 布局中)将其放置在最后。酌情添加边距。

但实际上在这种情况下,您可能只想为按钮添加一个图标:

<Button
    ...
    app:icon="@drawable/ic_next"
    app:iconGravity="end"
    style="@style/Widget.MaterialComponents.Button.TextButton.Icon"
/>

(属性here的概要)

【讨论】:

请再次检查我的问题。我已经按照您在回答中提到的那样实现了,但现在按钮与图像视图重叠。你能帮忙吗? @Kiran 尝试给图标一个高度(android:elevation),2dp 可能会起作用,但请检查当您按下按钮时按钮没有提升到它上方。同样,您可能只想为按钮本身添加一个图标,它提供了该功能并避免了奇怪的行为! 实际上,图像需要与按钮具有不同的背景颜色,因此我在按钮上添加了图像视图。【参考方案2】:

在您的ImageView 中添加以下代码。 btnLogin 是您的按钮 id 的 id,在顶部和底部约束中添加父级以使 imageview 垂直居中对齐。

app:layout_constraintEnd_toEndOf="@+id/btnLogin"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"

编辑:

使用一个ConstraintLayout在按钮上重叠图像,您需要添加android:stateListAnimator="@null",但是使用这个所有的高程和平移Z都不会显示到Button。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btnSubmit"
        android:layout_
        android:layout_
        android:layout_marginBottom="20dp"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="20dp"
        android:textColor="@color/white"
        android:text="Submit"
        android:background="@color/purple_700"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:stateListAnimator="@null"/>

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/imgNext"
        android:layout_
        android:layout_
        app:srcCompat="@drawable/ic_next"
        android:padding="16dp"
        android:layout_marginEnd="20dp"
        app:layout_constraintTop_toTopOf="@id/btnSubmit"
        app:layout_constraintBottom_toBottomOf="@id/btnSubmit"
        app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

以上代码的输出:

有关添加高程和重叠视图的更多信息,请查看answer

【讨论】:

你有办法只使用一个约束布局来制作这个布局吗? @Kiran 请检查已编辑的答案

以上是关于在约束布局中的按钮上重叠图像视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在约束布局上实现重叠/负边距?

是否可以使用自动布局重叠视图?

2 TextViews 在约束布局中相互重叠

如何正确设置水平图像视图的自动布局约束?

使用自动布局和约束设置按钮

我可以设置我的自动布局约束,以便将图像视图设置为图像的高度