高于2dp的高度会导致按钮消失

时间:2017-09-30 11:33:50

标签: android android-layout button android-elevation

在下面的代码中,我有一个海拔为8dp的白色视图。蓝色按钮的高度为10dp,理论上应该显示。但事实并非如此。它仅显示不直接在白色视图上的部分。我知道这与升高有关但我不确切知道是什么。我怀疑当白视图=< 2时它很好,但是一旦我将它设置得更高,就会出现问题。

enter image description here

这是我的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/login_background"
            android:background="@color/colorPrimary" />

        <View
            android:id="@+id/view"
            android:layout_width="@dimen/login_container_width"
            android:layout_height="@dimen/login_container_height"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="@dimen/login_container_margin_top"
            android:background="@drawable/login_container"
            android:elevation="8dp">

        </View>

        <Button
            android:id="@+id/button"
            android:layout_width="190dp"
            android:layout_height="50dp"
            android:layout_marginBottom="52dp"
            android:background="@drawable/login_button"
            android:elevation="10dp"
            android:text="LOGIN"
            android:textColor="@color/white"
            android:textSize="20sp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true" />

    </RelativeLayout>

</LinearLayout>

1 个答案:

答案 0 :(得分:1)

以下内容反映了this Stack Overflow问题和接受的答案。

让我们考虑一下你的开始。我无法访问您的所有尺寸等,以使下面的内容与您的示例完全相同,但基础就在那里。以下是基本布局。您可以看到该按钮位于视图下方,即使该视图的高程为8dp且该按钮的高程为10dp

enter image description here

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorPrimaryDark">

        <View
            android:id="@+id/view"
            android:layout_width="match_parent"
            android:layout_height="175dp"
            android:layout_alignBottom="@+id/button"
            android:layout_alignParentEnd="true"
            android:layout_alignParentStart="true"
            android:layout_margin="30dp"
            android:background="@android:color/white"
            android:elevation="8dp">

        </View>

        <Button
            android:id="@+id/button"
            android:layout_width="190dp"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="52dp"
            android:background="@mipmap/ic_launcher"
            android:elevation="10dp"
            android:text="LOGIN"
            android:textColor="@color/white"
            android:textSize="20sp" />

    </RelativeLayout>

</LinearLayout>

那么,为什么呢?这是因为按钮的XML中的android:elevation="10dp"并未真正定义高程。相反,按钮的高程由控制android:elevation和android:translationZ属性的"StateListAnimator"控制。“(参见上面提到的问题的接受答案。)

如果您并不真正关心StateListAnimator正在为您的布局做些什么,您可以通过将android:stateListAnimator="@null"添加到按钮的XML来简单地消除它。这是添加此代码后布局的样子。 (请注意,设计人员可能不会立即显示更改; Android Studio 3.0 Beta 6没有)。因此,您可能需要刷新布局才能看到更改。

enter image description here

如您所见,按钮现在正如我们所期望的那样位于视图上方。

如果您确实关心StateListAnimator为您做了什么,您将需要定义自己的名称,并在上面更改的XML语句中输入其名称而不是@null。我上面提到的答案包含Android可能使用的StateListAnimator,因此您可以将其作为基础并将高程更改为您喜欢的。我没试过,但它应该有用。