在不同密度下使用dp和sp存在问题

3

我在不同的密度下测试了一个简单的布局。以下是activity_main.xml的布局xml代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="32dp"
    tools:context="com.noah.densitytest.MainActivity"
    android:background="@color/gray" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:padding="4dp"
        android:background="#000000" >

        <TextView
            android:id="@+id/tv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world"
            android:textSize="16sp"
            android:layout_marginTop="32dp"
            android:background="@color/algea_green" />

        <View
            android:id="@+id/square_top"
            android:layout_width="16dp"
            android:layout_height="16dp"
            android:layout_marginLeft="16dp"
            android:layout_toRightOf="@id/tv1"
            android:background="@color/aqua" />

        <View
            android:id="@+id/square_center"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_centerInParent="true"
            android:layout_marginRight="32dp"
            android:background="@color/blue" />

        <View
            android:layout_width="32dp"
            android:layout_height="256dp"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@id/square_center"
            android:background="@color/dark_slate_blue" />

        <View
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:layout_toRightOf="@id/square_top"
            android:layout_marginLeft="48dp"
            android:layout_marginTop="128dp"
            android:background="@color/medium_purple" />

    </RelativeLayout>

</RelativeLayout>

我只把它放在一个单独的文件夹 - res/layout 中。我使用了dp,这被称为密度无关单位,并且Android会自动缩放给定的值。然而,问题在于布局在每个密度下显示不同。我使用了mdpi、hdpi、xhdpi和xxhdpi AVD。但是所有其他属性都是8英寸、1280x720、normal、long - 在所有测试设备上都是如此。那么为什么它们看起来不同呢?在其他密度下看起来非常丑陋。我还尝试将其复制到特定的文件夹中,如layout-mdpi、layout-hdpi等,但结果仍然相同。然而,如果我使用像素作为单位,那么所有设备上的布局看起来都一样。为什么使用像素似乎更好呢?
希望您能向我解释这个问题,或者提供给我一些好的链接,让我深入了解Android是如何做到这一点的,以及为什么推荐使用dp而不是像素,因为这与结果相反。
以下是结果的外观:
2个回答

3
你混淆了密度、分辨率和物理大小。
dip/dp或设备无关像素始终相同,不受分辨率影响。所有以dip/dp为单位的值都是基于mdpi的,即基准密度。每个密度的值为:
- mdpi: 160dpi(每英寸点数) - tvdpi: 231dpi - hdpi: 240dpi - xhdpi: 320dpi
这意味着,如果屏幕密度相同,分辨率大小将不会影响值。
例如:对于一个(1280x720, mdpi)的设备和另一个(640x480, mdpi)的设备,16dp在两个设备上都是16px。
另一方面,不同的密度会影响dp单位的物理大小/px。其因子是其密度与mdpi之比。

示例:如果使用 dp 单位,在 hdpi 设备上的大小将比 mdpi 大 1.5 倍(240/160)。xhdpi 设备将比 mdpi 大 2 倍(320/160)。

这意味着,如您所示的图像,具有相同分辨率但不同密度的设备将具有不同的大小!更高密度将占用更多空间。

相反,当您在恒定分辨率中使用 px 时,您将看不到每个密度的差异,因为它不包含在计算中。

例如:对于一个具有 (1280x720, mdpi)、(1280x720, hdpi) 和 (640,480, xhdpi) 的设备,16px 就是... 16px


更多阅读:


哇,非常感谢您的详细解释!那么如果不使用像素(px)该如何修复这个问题呢?因为 Google 不建议使用 px。空间差异会严重影响用户体验,特别是在 mdpi 和 xxhdpi 之间的差异,边框非常粗,而粉色框几乎跑到了屏幕外面。 - Gwapo Gwapo
我也尝试过在布局中使用values-mdpi等,然后使用@dimens,但仍然没有效果。我尝试在values-mdpi上填充32dp,在values-hdpi上填充48dp等,但情况变得更糟了,在xxhdpi上边框变得非常粗。 - Gwapo Gwapo
如果您更关心物理尺寸,也许可以使用更简单的“大小”限定符(layout-smalllayout-normal等)或更灵活的“最小宽度”限定符(layout-sw600dplayout-sw720dp等)。您可以在答案中的第一个链接中了解更多信息。至于 @dimens,可能您想要将尺寸缩小而不是放大,以适应更高的密度,尽管这有点违背了初衷。 - Andrew T.
您好,我目前在WMS请求不透明度方面遇到了问题,请在http://stackoverflow.com/questions/27936381/how-do-i-set-the-opacity-of-a-wms-requested-layer-in-android-google-maps-api上提供帮助。谢谢 :) - Gwapo Gwapo

-1

这种方法并不总是能正常工作。您需要有单独的布局文件夹才能按照您想要的方式工作。这些文件夹包括: layout-large layout-large-land layout-xlarge layout-xlarge-land layout-small layout-small-land

如果您不需要所有这些文件夹,可以省略其中的小型文件夹和layout-xlarge-land。但是,使用这些文件夹后,Android将自动加载适用于您正在使用的屏幕大小的正确XML。例如,layout-large将在像Nexus 7这样的设备上使用。


你好,感谢您的快速回复。我使用了相同的屏幕尺寸,但只有不同的密度。因此,我认为使用像layout-mdpi、layout-hdpi等文件夹会起作用。但结果仍然相同。 - Gwapo Gwapo

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