首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android屏幕密度计算

Android屏幕密度计算
EN

Stack Overflow用户
提问于 2012-01-29 22:08:05
回答 8查看 10.6K关注 0票数 6

谁能告诉我Android是如何计算屏幕密度的?

我的问题是我有一个480x800分辨率和7英寸对角线屏幕的设备(ODYS Space)。如果我计算它的密度,我得到的值是133 DPI,但Android (2.2和2.3也是)报告它是“中”密度设备(160 DPI)。

我正在与多屏幕支持作斗争,所以我认为133 DPI将被报告为“低”而不是“中”,所以现在我的屏幕布局在这个中等报告的设备上看起来相当愚蠢。

我用下面这样的代码检查设备:

代码语言:javascript
复制
DisplayMetrics dMetrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(dMetrics);  
int d=dMetrics.densityDpi;

如果我在已配置虚拟设备(480x800/7“和133DPI)上运行该代码,则会得到density=120。

在真正的设备上,为什么显示为160?

EN

回答 8

Stack Overflow用户

发布于 2014-09-21 03:23:55

这里有两个不同的东西。

AVD

  • 仿真器中的行为,它是AVD管理器、配置AVD本身以及可能使用设备定义的组合。仿真器系统映像已经预留了值,这样我们就可以为所有设备配置提供相同的映像。此烘焙输入值是密度的mdpi。当您创建具有不同密度的AVD时,我们会在启动前注入新值。注入的值被转换为密度桶值(ldpi,mdpi,hdpi,...)基于基本规则(如果超过了存储桶值之间的半点,则进入下一个值)。

因此,120和160之间的半点是140,因此133dpi -> ldpi。

  1. 设备可以随心所欲。对于任何OEM来说,决定其设备的存储桶值是什么是一个手动过程,并在一个属性中进行设置。它不是基于设备的实际硬件屏幕尺寸动态计算的。你可以做一个真正的屏幕密度为133的设备,如果你想的话,还可以把它放在xxdpi桶里。

最终的结果是,你需要创建一个新的设备定义,在这里你手动地说你的7英寸480x800设备实际上是一个中等密度的设备,它应该可以工作。如果它不能工作,当我们为一个特定的基于AVD的设备配置仿真器时,这对我们来说是一个错误。这在Android平台本身不是一个问题,因为它不计算任何东西。

票数 3
EN

Stack Overflow用户

发布于 2014-03-05 10:02:30

我已经更新了2014年的另一个解决方案。

在您的某个活动中调用此方法:

代码语言:javascript
复制
private void tellMeDensity() {
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int dpiClassification = dm.densityDpi;

        float xDpi = dm.xdpi;
        float yDpi = dm.ydpi;

        Toast.makeText(this, "xdpi=" + xDpi, Toast.LENGTH_SHORT).show();
        Toast.makeText(this, "ydpi=" + yDpi, Toast.LENGTH_SHORT).show();

        switch(dpiClassification) {
           case DisplayMetrics.DENSITY_LOW:
               Toast.makeText(this, "low density", Toast.LENGTH_SHORT).show();
               break;    
           case DisplayMetrics.DENSITY_MEDIUM:
               Toast.makeText(this, "medium density", Toast.LENGTH_SHORT).show();
               break;                
           case DisplayMetrics.DENSITY_HIGH:
               Toast.makeText(this, "high density", Toast.LENGTH_SHORT).show();
               break;    
           case DisplayMetrics.DENSITY_XHIGH:
               Toast.makeText(this, "xhigh density", Toast.LENGTH_SHORT).show();
               break;                  
           case DisplayMetrics.DENSITY_XXHIGH:
               Toast.makeText(this, "xxhigh density", Toast.LENGTH_SHORT).show();
               break;                  
           case DisplayMetrics.DENSITY_XXXHIGH:
               Toast.makeText(this, "xxxhigh density", Toast.LENGTH_SHORT).show();
               break;      
        }
    }
票数 2
EN

Stack Overflow用户

发布于 2014-09-18 15:55:52

实际上,如果您想要实际显示dpi,如果您查询显示指标,答案介于两者之间:

代码语言:javascript
复制
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int dpiClassification = dm.densityDpi;
float xDpi = dm.xdpi;
float yDpi = dm.ydpi;

densityDpi将为您提供您应该使用的密度的值/建议

代码语言:javascript
复制
0.75 - ldpi - 120 dpi
1.0 - mdpi - 160 dpi
1.5 - hdpi - 240 dpi
2.0 - xhdpi - 320 dpi
3.0 - xxhdpi - 480 dpi
4.0 - xxxhdpi - 640 dpi

正如之前的帖子中指定的那样

但是dm.xdpi不会总是给你给定显示器的实际dpi,所以也许显示器的实际dpi应该是dpi。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9053779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档