我测试了不同密度的简单布局。这是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更值得推荐,这与此结果有所不同。
结果如下:
答案 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之类的设备上。