从px到dp的转换,适用于谷歌Nexus 7。

9

我是一名新手,涉及到平板应用程序开发。我使用的是分辨率为(600 * 960 dip)的Google Nexus7,那么我想知道它是否属于mdip类别?根据1px = 1dp(基线),但是如果我跟随这个方法,在平板上看起来并不好。我对Nexus 7创建了单独的布局文件夹-sw600dp,并按照mdip指定大小,但是它不起作用。我的图片也不好看。我想知道Google Nexus 7的实际转换率是多少。需要帮助。


1
请使用此链接:http://www.xcubelabs.com/dpi/index.html,它将会有所帮助。 - Padma Kumar
我发现这个非常有用:http://dpi.lv/ - J0ANMM
3个回答

14

公式:像素 = 设备独立像素 * (设备像素密度 / 160)

Nexus 7 的分辨率为 800x1280,像素密度为 213 px,这意味着它的分辨率代码是 tvdpi(这意味着您可以有一个名为drawable-tvdpi的文件夹)。

您可以通过以下方法测量可用屏幕大小(减去窗口装饰):

this.getResources().getConfiguration().screenWidthDp;
this.getResources().getConfiguration().screenHeightDp;

在我的N7上,它返回600dp w,888dp h。根据上述公式,888dp高度为1280px-窗口装饰。


谢谢您的帮助。如果我想定义一个50像素的布局,那么相应的dp值是dp = (50 / 213) * 160,对吗? - nilkash
没错。如果这有帮助,请标记问题为已解决。谢谢! - Mike P.

4
"Nexus7是一款独特的设备,它的dpi结构有些奇怪。"
"对于Nexus 7:"
layout-large-hdpi

这是一篇非常好的解释(来自谷歌Android工程师Dianne Hackborn):Dianne Hackborn解释了Nexus7的独特分辨率

注意:应用程序只从这些文件夹中获取图像,如果您没有提供更高优先级的限定符。例如,如果您已经提供了一个像layout-sw360dp这样的布局文件夹,应用程序将仅从该文件夹中获取图像,即使您已经提供了单独的布局(如上所述)。因为在Android中有一个优先顺序,在其中您必须提供布局。

屏幕密度

通常称为dpi(每英寸点数)。 Android将所有实际屏幕密度分为四个一般化密度:低(120),中(160),高(240)和超高(320)。 Galaxy Nexus等设备具有“超高”屏幕密度(更具体地说,dpi值设置为320)。 Nexus 7使用“tvdpi”,即213 dpi。

密度无关像素

通常称为dp。这是显示内容时使用的虚拟像素单位。密度无关像素相当于160 dpi屏幕上的一个物理像素。要计算dp,请使用以下公式:

px = dp * (dpi / 160)

或者等价地:

dp = (px / dpi) * 160

Nexus 7能够显示比Galaxy Nexus更多的内容,尽管它们的分辨率相似,原因在于:Nexus 7的dpi低于Galaxy Nexus。
Galaxy Nexus的dpi为320,宽度为720像素。
(720 / 320) * 160 = 360 dp

Nexus 7 (213 dpi, 宽度为800像素)
(800 / 213) * 160 = 600 dp

这意味着,当应用程序在Galaxy Nexus上渲染时,屏幕的宽度实际上是360 dp(使用720像素进行渲染)。而在Nexus 7上,屏幕的宽度为600 dp(使用800像素进行渲染)。


@GrlsHu谢谢你的帮助。根据你的解决方案,如果我想定义一个50像素的布局,那么相应的dp将是dp = (50 / 213) * 160,对吗? - nilkash
是的,正确的,那将是动态规划计算。 - GrIsHu

1

尝试以下代码,将像素值传递给下面的方法,它将以dp为单位返回结果。

public int convertSizeToDeviceDependent(int value) {
            DisplayMetrics dm = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(dm);
            return ((dm.densityDpi * value) / 160);
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接