如何以 dpi 获得屏幕宽度?

Posted

技术标签:

【中文标题】如何以 dpi 获得屏幕宽度?【英文标题】:How to get screen width in dpi? 【发布时间】:2014-03-27 04:32:43 【问题描述】:

如何获取屏幕宽度dpi?

DisplayMetrics metrics = getResources().getDisplayMetrics();
int f = metrics.densityDpi;


  //  getWindowManager().getDefaultDisplay().getMetrics(metrics);

int width = metrics.widthPixels;
int dp = (int)(width / (metrics.density));

我这样做了,所以假设我的 densitydpi 是 120.. 和 widthpixel 240.. 通过计算我得到 240/0.75.... 所以我有 320 widthdpi?

但事实并非如此....widthdpi 小于 320 我认为...因为 320 在屏幕上对我来说是错误的....使用 120 可以工作。

在 Nexus 4 上...宽度为 768,密度 dpi 为 320...我除以 768/2,得到 384 正确的宽度密度 dpi(有效)

但是在 240、160、120 密度 dpi 等其他设备上……宽度 dpi 的计算似乎是错误的……

【问题讨论】:

我补充一点。例如在上述情况下...如果我做 layout_margin 20 dp...并且我从 320 中减去 40...我应该得到 280...但我得到 240 之类的东西...所以 widthdpi 计算错误 对于大多数应用程序,没有理由计算这些值,假设您一直在编写布局并使用 dp 值(无论设备具有何种密度显示,它都会自动正确缩放)。 【参考方案1】:

根据Supporting Multiple Screens guide's definition of DP

px = dp * (dpi / 160)

因此

dp = px / (dpi / 160)

或等效

dp = px * 160 / dpi

请记住,dp 代表“与密度无关的像素”,即 1dp 在 ldpi 设备上的物理尺寸与在 xxhdpi 设备上的物理尺寸相同。因此,您应该期望所有手机的宽度大约为 ~300-400dp,注意桶大小按 dp:

xlarge 屏幕至少为 960dp x 720dp 大屏幕至少为 640dp x 480dp 普通屏幕至少为 470dp x 320dp 小屏幕至少为 426dp x 320dp

【讨论】:

dp = (int) (width * 160 / metrics.densityDpi);我这样做了,我想我还是弄错了 在 240-320 px 的屏幕上,密度 dpi 120。我通过计算我的屏幕宽度 dp 320...但是如果我写 120dp 宽度,它也需要所有宽度。 你必须包含更多关于你在哪里使用这些值的代码,因为你没有解释什么需要所有宽度或者你试图用这些值做什么,但是关于如何的文档计算dp没有错。 我在 mathcaptchaactivity 中使用这个github.com/floydfix/android-Easy-Captcha 我给验证码 c = new MathCaptcha(dp, 100, MathOptions.PLUS_MINUS_MULTIPLY);这里的 dp 无论我给 240-320 像素和密度 dpi 120 的设备给它 320 还是 120,我都会得到所有宽度 嘿,我修好了。问题出在这里 im.setLayoutParams(new LinearLayout.LayoutParams(c.width*2 , c.height *2));它适用于 320 dpi....我所做的只是乘以 metrics.density 而不是 2。这就是为什么在设备 120 dpi..它是 320*2 = 640...现在它的 320*0.75 = 240 ....

以上是关于如何以 dpi 获得屏幕宽度?的主要内容,如果未能解决你的问题,请参考以下文章

weex屏幕适配的问题怎么解决

如何获得具有相同屏幕宽度的 Web 视图?

如何在没有(减号)滚动条的情况下获得屏幕宽度?

Android DPI相关知识

如何根据屏幕的物理尺寸按比例缩放布局?

如何设置gridview的孩子的宽度以匹配屏幕宽度?