背景中居中的元素与前景中居中的元素不匹配

时间:2018-10-02 17:05:03

标签: android

我正在开发一个Android应用程序,我想在其中创建一个具有居中元素的windowBackground和一个也具有居中元素的布局。我希望这些元素位于完全相同的位置,并且布局与背景重叠。我遇到的问题是布局和背景似乎在计算中心时有所不同(请参见图片)。为什么会发生这种情况,我该怎么做才能将元素对齐?

这就是我现在看到的。红色框由背景创建,绿色框由前景创建。屏幕截图是使用Nexus 5X API 26仿真器创建的。 centered element mismatch example

前景布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <View
        android:background="@color/foreground_box"
        android:layout_width="10dp"
        android:layout_height="10dp"
        android:layout_centerInParent="true" />
</RelativeLayout>

背景可绘制对象(通过android:windowBackground应用于我的主题)

<?xml version="1.0" encoding="UTF-8" ?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/background" />
    <item android:gravity="center">
        <shape
            android:gravity="center"
            android:shape="rectangle">
            <solid android:color="@color/background_box" />
            <size android:width="10dp"
                android:height="10dp" />
        </shape>
    </item>

</layer-list>

为清楚起见,我的颜色文件为

<?xml version="1.0" encoding="utf-8"?>
<resources>   
    ...
    <color name="background">#ffffff</color>
    <color name="background_box">#AAFF0000</color>
    <color name="foreground_box">#AA00FF00</color>
</resources>

此示例项目的完整源代码可在https://github.com/HofmaDresu/AndroidCenteredTest

中找到。

3 个答案:

答案 0 :(得分:1)

windowBackground的原因包括高度 1)statusBar和2)actionBar

在background.xml中修改以下行

<item android:gravity="center" android:top="80dp"> // 56 actionBarSize + 24 statusBarHeight

由于statusBarHeight和actionBarSize随设备API /分辨率而异,因此您可能需要以编程方式进行管理。

这是结果。为了进行测试,请将调整后的背景尺寸设置得更大一些,以使视图和背景之间的重叠变得可见。

enter image description here

答案 1 :(得分:0)

这可能是由于ActionBar在前台占用的额外空间。

要解决此问题,可以在前景布局中的View上添加边距,如下所示:

android:layout_marginBottom="?android:attr/actionBarSize"

答案 2 :(得分:0)

在AS中对其进行测试之后,我可以说适合您background_drawable的代码是这样的:

<?xml version="1.0" encoding="UTF-8" ?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/background" />

    <item android:gravity="center" android:bottom="48dp">
    <shape
        android:gravity="center"
        android:shape="rectangle">
        <solid android:color="@color/background_box" />
        <size
            android:width="10dp"
            android:height="10dp" />
    </shape>
</item>

使用 android:top ,红色方块比中心线下降得更多。需要使用 android:bottom 代替背景居中。根据我的测试结果,48dp是正确的值。