在不同的密度上使用dp和sp时遇到问题

时间:2014-08-07 02:26:45

标签: android android-layout layout screen

我测试了不同密度的简单布局。这是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。但所有其他属性都是8in,1280x720,正常,长 - 所有测试设备。那么他们为什么看起来不一样呢?在其他密度上看起来真的很难看。我也尝试将它复制到特定文件夹,如layout-mdpi,layout-hdpi等,但结果仍然相同。

但是,如果我使用px作为单位,那么所有设备上的布局看起来都是一样的。为什么使用px似乎更好?

我希望你能向我解释一下,或者能为我提供良好的链接,我可以深入了解Android是如何做到这一点的,为什么dp比px更值得推荐,这与此结果有所不同。

结果如下:

2 个答案:

答案 0 :(得分:2)

密度,分辨率和物理尺寸之间存在混淆。

无论分辨率如何,

dip / dp或与设备无关的像素始终相同。所有以dip / dp编写的单位都基于mdpi,这是基线密度。每个密度的值是:

  • mdpi:160dpi(每英寸点数)
  • tvdpi:231dpi
  • hdpi:240dpi
  • xhdpi:320dpi

这意味着分辨率有多小/大,如果屏幕密度相同,则值也相同。

示例:对于具有(1280x720,mdpi)和其他设备(640x480,mdpi)的设备,两台设备中 16dp为16px

另一方面,不同的密度会影响px单位的物理尺寸/ dp。该因子是其密度与mdpi的比率。

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

这意味着,如图所示,具有相同分辨率但密度不同的设备将具有不同的尺寸!密度越大,空间越大。

相反,当您以恒定分辨率使用px时,您会发现每个密度没有差异,因为它不包含在计算中。

示例:对于具有(1280x720,mdpi),(1280x720,hdpi)和(640,480,xhdpi)的设备, 16px是......好,16px


更多阅读:

答案 1 :(得分:-1)

那不会一直正常工作。您需要具有单独的布局文件夹才能使其按您希望的方式工作。文件夹是 布局大 布局大土地 布局XLARGE 布局XLARGE土地 布局小 布局小土地

如果你不想要,你不需要所有这些文件夹,我倾向于遗漏小文件夹和layout-xlarge-land。但是使用这些文件夹,Android会自动加载适用于您正在使用的屏幕尺寸的正确XML。防爆。 layout-large将用于诸如Nexus 7之类的设备上。

相关问题