Android DPI相关知识

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android DPI相关知识相关的知识,希望对你有一定的参考价值。

参考技术A

手机屏幕的像素点数,一般描述成屏幕的"长 * 宽",安卓手机常见的分辨率有480 * 800, 720 * 1280, 1080 * 1920
480 * 800表示在宽度方向有480个像素,在长度方向有800个像素

屏幕大小是手机对角线的物理尺寸,以 英寸 为单位,如5英寸手机,即对角线长度为:5 * 2.54厘米/英寸 = 12.7厘米

屏幕密度指的是每英寸的像素点数
假设一个5英寸1080 * 1920手机,则 可通过勾股定理得到对角线有2203个像素 ,从而得到屏幕密度DPI为:
2203 / 5 = 440 ,即手机DPI为440

安卓系统设定的固定密度范围是:

NOTE:Android是以160dpi为基准屛,此时1dp = 1px
mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi = 1 : 1.5 : 2 : 3 : 4

Windows DPI 相关问题

【中文标题】Windows DPI 相关问题【英文标题】:Windows DPI related issues 【发布时间】:2015-10-15 19:55:28 【问题描述】:

抱歉,我没有给出具体的问题标题。

我的开发环境是带有 Visual Studio 2010 的 Windows 7。产品面向 Windows 7、8 和 10。

问题 1: 我怎样才能获得当前的 DPI 设置?

下面的代码总是返回 96,即 100% DPI 比例。

_dpiX = GetDeviceCaps(hdc, LOGPIXELSX);

问题 2: 我怎样才能得到实际的分辨率?

我尝试使用带有不同选项的 GetSystemMetrics,它们都返回相同的值,即缩放分辨率。例如,实际分辨率为 1920*1080 和 175% DPI,它们都返回 1097*617。

GetSystemMetrics(SM_CXFULLSCREEN)
GetSystemMetrics(SM_CXSCREEN)
GetSystemMetrics(SM_CXVIRTUALSCREEN)

问题 3: 我可以将应用设置为不使用 DPI 可视化功能吗?

我们有一个解决方法,涉及在“属性”->“兼容性”中勾选“在高 DPI 设置下禁用显示缩放”选项,并使用“更改所有用户的设置”。我在 Visual Studio 中将项目 DPIAwareness 设置为 true,但它什么也没做。

编辑: 有人说如果产品设置为 DPI 感知,它将无法获得 DPI 可视化。在我的例子中,它是一个将一些命令参数传递给另一个可执行文件的 GUI 程序。我在我的项目中将可执行的 DPIAwareness 设置为 true。但是 GUI 什么也没做。因此,如果 GUI 不支持 DPI,并且它启动了其他进程,那么其他进程是否也不支持 DPI?

【问题讨论】:

只要你不回答问题3,你就不会在乎1和2。很多很多方法可以自己找出来,谷歌“windows enable dpiawareness”。跨度> 事实上,如果我能解决问题 3,我可能只是解决了问题。关于问题 3 的核心思想是如何在我的项目中禁用 DPI 可视化。有人说将 DPIAwareness 设置为 true 会禁用它。但它似乎不起作用。 【参考方案1】:

第一个问题,你试过了吗?

monitorhandle = MonitorFromWindow(winH, MONITOR_DEFAULTTONEAREST)

winH 是程序窗口的句柄

MONITOR_DEFAULTTONEAREST = 2

然后:

GetDpiForMonitor(monitorhandle, MDT_EFFECTIVE_DPI, PointerToX, PointerToY)

MDT_EFFECTIVE_DPI = 0

这将检索 PointerToX 和 PointerToY 中的 DPI 设置

如果您需要 Windows 缩放值,您可以除以 96(当然*100 表示百分比)

如果在开始时设置 SetProcessDpiAwareness(1) 并没有帮助,我感到很惊讶,因为这应该消除设置兼容性标志的需要,尽管我不希望它在你的程序中自动扩展 GUI - 因此回答问题 1!

【讨论】:

【参考方案2】:

问题是您的应用程序不知道 DPI 要让它知道你需要在应用程序的清单文件中使 <dpiaware> 标记为 TRUE

仍然在这种情况下,您可以获得实际分辨率

你可以这样做

actualWidth = GetDeviceCaps(hdc, DESKTOPHORZRES);
actualHeight = GetDeviceCaps(hdc, DESKTOPVERTRES);

DESKTOPHORZRES 和 DESKTOPVERTRES 索引在 MSDN 中未提及,但它们会为您提供实际的宽度和高度

有一个函数GetDpiForWindow()可以为您提供 DPI 的实际值 但它只能在 Windows 10 或更高版本中使用

【讨论】:

以上是关于Android DPI相关知识的主要内容,如果未能解决你的问题,请参考以下文章

Android中View的相关知识

Android中View的相关知识

Android中View的相关知识

Android多线程相关知识总结——源码分析

Android中View的相关知识

Android中view相关的知识