密度像素(dp)不适用于所有分辨率

MD *_*hir 0 android pixels

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@color/gray"
        android:orientation="vertical" > 

        <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@color/darkgray"
        android:gravity="center"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/attenders"
            android:layout_width="110dp"
            android:layout_height="40dp"
            android:layout_gravity="center"
        android:background="@color/gray"
        android:layout_marginRight="8dp"
        android:text="Attenders" />

    <Button
        android:id="@+id/send"
        android:layout_width="110dp"
        android:layout_height="40dp"
        android:layout_marginLeft="8dp"
        android:layout_gravity="center"
        android:background="@color/gray"
        android:text="Send IM" />
    </LinearLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

这是我的代码,但 dp 不适用于所有屏幕分辨率。建议请告诉我,如果我做错了什么

jos*_*hus 6

问题是,当我使用 dp 来设置按钮的高度或宽度时,它并不适合所有分辨率,即在小屏幕上看起来很大,在大屏幕上看起来很小,而我知道当我们使用 dp 来设置高度和它根据屏幕分辨率自动转换/调整的任何组件的宽度

我从中了解到的是,您认为使用dp而不是px(或in,或cm)会神奇地工作,这样它们在所有设备上都将具有相同的物理大小,而不管该设备的密度(ppi)如何。

事实并非如此。

dp 或 dip,正如这里所解释的,是

基于屏幕物理密度的抽象单位。这些单位相对于 160 dpi(每英寸点数)屏幕,在该屏幕上 1dp 大致等于 1px。

与具有 160dpi 的屏幕相比,具有更高 dpi(更密集,意味着更多像素被装入屏幕的方形区域)的屏幕在绘制相同的(例如,100x100 dp)图像时,本质上将绘制物理上更小的图像。

在更高密度的屏幕上运行时,用于绘制 1dp 的像素数会按适合屏幕 dpi 的系数放大。

解决方案

有两种简单的方法可以让您的应用在不同的屏幕尺寸上按比例看起来相同。

首先是使用不同的布局文件夹(layout-ldpi、layout-mdpi等)。这种技术在这里得到了很好的解释。一种更推荐的方法是style为每个密度使用不同的值,因此您仍然可以保留一个layout文件夹并参考样式进行测量。这可以使用相同的技术来完成,但您将拥有 values-ldpi、values-mdpi 等。这对于跨屏幕尺寸具有标准尺寸的 UI 元素非常有用。

另一种方法是在weights整个布局中使用。无论屏幕密度大小如何,权重都会自动调整。如果您想要三列宽度不同的列,这将很有帮助——您可以轻松地使用权重来告诉布局 A 列需要占据屏幕可用宽度的 40%,而 B 和 C 将有各 30%。这对于跨屏幕尺寸的标准布局很有用。

一个外观干净、编码良好的应用程序将实现两者。