Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在不同密度上使用dp和sp存在问题_Android_Android Layout_Layout_Screen - Fatal编程技术网

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

Android 在不同密度上使用dp和sp存在问题,android,android-layout,layout,screen,Android,Android Layout,Layout,Screen,我在不同密度上测试了一个简单的布局。以下是activity\u 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="matc

我在不同密度上测试了一个简单的布局。以下是
activity\u 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更受推荐,而px恰恰相反

结果如下:


这并不总是能正常工作。您需要有单独的布局文件夹,以使其按您想要的方式工作。文件夹是 大布局 大面积土地布局 布局xlarge 大面积土地布局图 布局小 规划小型土地


你不需要所有这些文件夹,如果你不想,我倾向于省去小文件夹和布局xlarge土地。但是有了这些文件夹,Android将自动加载适用于您使用的屏幕大小的正确XML。大型布局将用于Nexus 7等设备

您混淆了密度、分辨率和物理尺寸

无论分辨率如何,
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)和(640480,xhdpi)的设备,16px是。。。嗯,16px


更多阅读:


您好,感谢您的快速回复。我使用相同的屏幕尺寸,但密度不同。所以我认为使用像layout mdpi、layout hdpi等文件夹会很有效。但是结果还是一样。哇,非常感谢你的解释!那么,我如何使用px解决这个问题呢?因为谷歌不鼓励使用px。这种空间上的差异确实会影响用户体验。特别是mdpi和xxhdpi之间的差异,边框非常厚,粉色框几乎超出屏幕。我也尝试在布局上使用值mdpi等,然后使用@dimens,但仍然没有效果。我尝试在mdpi值上填充32dp,在hdpi值上填充48dp,等等,但情况变得更糟,在XXHDPI上边界变得非常厚如果你更关心物理大小,也许你可以使用更简单的“大小”限定符(
layout small
layout normal
,等等)或更灵活的“最小宽度”限定符(
layout-sw600dp
layout-sw720dp
等)。您可以在答案中的第一个链接上了解更多信息。至于
@dimens
,您可能希望缩小尺寸,而不是更大,以达到更高的密度,尽管这有点违背了目的。您好,先生,我目前在WMS请求不透明度方面遇到问题,请在上提供帮助。谢谢:)