为什么在Android XML中指定1px有时是2px?

时间:2010-04-23 14:48:08

标签: android

我想要一个像素的分割线,只是为了看起来。我想我可以使用高度为1px的视图来实现这个目标。但是,我在不同的设备上得到一些非常奇怪的行为 - 有时1px最终为2px。

以此示例布局为例:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
</LinearLayout>

在G1 this comes out fine上运行时。但是在Nexus One上,it alternates between 1px lines and 2px lines

有谁知道这会出错吗?为什么Android有时会将1px变为2px?

编辑:为了使这个绝对清楚,我不关心特别是解决我的例子;在任何情况下,我关心的是能够说“这个视图应该是1px高”,而不仅仅是这个例子。

3 个答案:

答案 0 :(得分:8)

您是在构建针对SDK 1.5,还是设置android:anyDensity =“false”?如果你的应用程序没有说它支持密度,那么Android将在兼容模式下运行,它使屏幕看起来像mdpi屏幕,缩放所有坐标和绘图以匹配真实的屏幕密度。在像Droid这样的hdpi屏幕上运行,这是一个1.5倍的缩放比例,因此每隔一个“像素”将被映射到屏幕上的两个像素。

今天的应用程序应该编写为支持不同的屏幕,在这种情况下,px和dp单元将在所有屏幕上按照需要运行。

答案 1 :(得分:1)

我想这会发生在线在像素之间的边缘的地方;这是因为你将dp(密度无关)像素测量与绝对值混合?如果设备具有不同的dp /像素比率,则边距(以dps定义)可能会将分隔符放在像素之间的边缘上。

尝试将边距更改为4px而不是4dp。

答案 2 :(得分:0)

我知道这不是问题,但是如果你使用的是ListView,你有一些分隔属性:

android:divider="" /*color, drawable, etc*/
android:dividerHeight="1dip"

另外,你真的不应该使用像素而是独立的密度测量..