如何以dpi为单位获取屏幕宽度?

6

如何获取屏幕宽度的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,densitydpi为320...我将768/2除以,得到384正确的宽度密度dpi(它有效)。
但在其他像240、160、120 density dpi的设备上,width dpi的计算似乎是错误的...

有一些我添加的东西。例如在上面的情况下...如果我做layout_margin 20 dp...并且我从320中扣除40...我应该得到280..但我得到了240之类的东西...所以widthdpi计算错误。 - user3278732
对于大多数应用程序而言,没有必要计算这些值,假设您正在编写布局并使用 dp 值(无论设备具有什么密度显示,它都会自动缩放正确的内容)。 - ianhanniballake
1个回答

14

根据支持多屏幕指南中对DP的定义

px = dp * (dpi / 160)

因此

dp = px / (dpi / 160)

或者等价地说

dp = px * 160 / dpi

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

  • 超大屏幕至少为960dp x 720dp
  • 大屏幕至少为640dp x 480dp
  • 正常屏幕至少为470dp x 320dp
  • 小屏幕至少为426dp x 320dp

dp = (int) (width * 160 / metrics.densityDpi); 我这样做了,但我认为还是错了。 - user3278732
在屏幕分辨率为240-320像素,密度为120dpi的情况下,通过计算得知我的屏幕宽度为320dp。然而,如果我设置宽度为120dp,它会占据整个屏幕宽度。 - user3278732
你需要在使用这些值的地方包含更多的代码,因为你没有解释什么占据了所有的宽度或者你想用这些值做什么,但是如何计算dp的文档是正确的。 - ianhanniballake
我正在使用https://github.com/floydfix/Android-Easy-Captcha。在MathCaptchaActivity中,我使用以下代码:Captcha c = new MathCaptcha(dp, 100, MathOptions.PLUS_MINUS_MULTIPLY);其中dp的值为320或120,对于分辨率为240-320像素且密度为120dpi的设备,我得到了所有宽度被占用的情况。 - user3278732
嘿,我修好了。问题出在这里:im.setLayoutParams(new LinearLayout.LayoutParams(c.width2 , c.height 2)); 它只适用于320 dpi……我所做的就是将其乘以metrics.density而不是2。这就是为什么在120 dpi的设备上它会乘以3202 = 640……现在它是3200.75 = 240…… - user3278732
太好了!当你能找到根本问题时总是一种好的感觉。如果这个答案有帮助,请接受它。 - ianhanniballake

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