在android中以编程方式获取屏幕密度?
如何在android中以编程方式获取屏幕密度?
我的意思是:如何找到当前设备的屏幕 dpi?
How to get the screen density programmatically in android?
I mean: How to find the screen dpi of the current device?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(21)
您可以从 DisplayMetrics 结构中获取有关显示屏的信息:
尽管 Android 没有不使用直接像素映射,它使用一些量化的密度独立像素值,然后缩放到实际的屏幕尺寸。因此,metrics.densisDpi 属性将是 DENSITY_xxx 常量之一(
120
、160
、213
、240
、320
、480
或640
dpi)。如果您需要实际 lcd 像素密度(可能对于 OpenGL 应用程序),您可以从
metrics.xdpi
和metrics.ydpi
属性获取分别为水平和垂直密度。如果您的目标 API 级别早于 4。
metrics.densis
属性是参考密度 (160dpi) 的浮点缩放因子。现在可以计算metrics.densisDpi
提供的相同值You can get info on the display from the DisplayMetrics struct:
Though Android doesn't use a direct pixel mapping, it uses a handful of quantized Density Independent Pixel values then scales to the actual screen size. So the
metrics.densityDpi
property will be one of theDENSITY_xxx
constants (120
,160
,213
,240
,320
,480
or640
dpi).If you need the actual lcd pixel density (perhaps for an OpenGL app) you can get it from the
metrics.xdpi
andmetrics.ydpi
properties for horizontal and vertical density respectively.If you are targeting API Levels earlier than 4. The
metrics.density
property is a floating point scaling factor from the reference density (160dpi). The same value now provided bymetrics.densityDpi
can be calculated这也有效:
这将为您提供:
0.75 - ldpi
1.0 - mdpi
1.5 - hdpi
2.0 - xhdpi
3.0 - xxhdpi
4.0 - xxxhdpi
参考:密度
参考 2
This also works:
This will give you:
0.75 - ldpi
1.0 - mdpi
1.5 - hdpi
2.0 - xhdpi
3.0 - xxhdpi
4.0 - xxxhdpi
ref: density
ref 2
这适用于 API 级别 4 及更高级别。
This will work on API level 4 and higher.
Blundell 的答案作为静态辅助方法:
Blundell's answer as a static helper method:
以下是一些密度常数,来源:
除标准密度外,还有 5 个中间密度。考虑到这一事实,以下代码将是一个完整的工作示例:
或者,您可以使用密度Dpi查找密度常数:
Here are some density constants, source:
There are, in addition to the standard densities, 5 Intermediate ones. Taking into account this fact, the following code will be a complete working example:
Alternatively, you can find density constants using the
densityDpi
:试试这个:
Try this:
获取 dpi:
To get dpi:
以下答案是基于 qwertzguy 答案的一个小改进。
The following answer is a small improvement based upon qwertzguy's answer.
实际上,如果您想要真实显示 dpi,答案介于两者之间
如果您查询显示指标:
密度的值/建议
密度Dpi * 160将为您提供应使用之前帖子中指定的
,但
dm.xdpi
不会始终为您提供真实dpi给定显示的:示例:
所以也许显示器的真实 dpi 应该是 Density*xdpi ..但我不确定这是否是正确的方法!
Actualy if you want to have the real display dpi the answer is somewhere in between
if you query for display metrics:
densityDpi * 160 will give you the values/suggestion which density you should use
as specified in previous posts
but
dm.xdpi
won't give you always the REAL dpi of given display:Example:
so maybe real dpi of the display should be Density*xdpi .. but i'm not sure if this is the correct way to do!
这应该对您的活动有所帮助...
输出:
This should help on your activity ...
OUTPUT :
如果你想从服务中检索密度,它的工作原理如下:
If you want to retrieve the density from a Service it works like this:
你应该尝试这个。刚刚添加了一个可以查找并显示 Toast 的方法。设备属于哪个类别。
http://www.androidwarriors.com/2016 /01/how-to-find- different-devices-screen.html
You Should Try This. Just Added a Method which will find and Show the Toast. That in Which Category the Device Falls.
http://www.androidwarriors.com/2016/01/how-to-find-different-devices-screen.html
这应该有效。
This should work.
还有一个答案:
Yet another answer:
试试这个...
在 kotlin 中
你可以通过
println("密度: ${defineScreenDensityCode()}") 调用
输出将为
System.out:密度:xxxhdpi
Try this...
In kotlin
You can call by
println("density: ${determineScreenDensityCode()}")
and the output will be
System.out: density: xxxhdpi
获取设备加载的密度的另一种方法:
为每个密度
values
文件夹values-hdpivalues在各自的
中添加字符串资源>strings.xml
:然后只需获取字符串资源,就可以得到密度:
如果密度大于
XXXHDPI
,则默认为XXXHDPI
或如果低于HDPI
,则默认为MDPI
我遗漏了
LDPI
,因为对于我的用例没有必要。Another way to get the density loaded by the device:
Create
values
folders for each densityAdd a string resource in their respective
strings.xml
:Then simply get the string resource, and you have your density:
If the density is larger than
XXXHDPI
, it will default toXXXHDPI
or if it is lower thanHDPI
it will default toMDPI
I left out
LDPI
, because for my use case it isn't necessary.Kotlin
LocalContext.current.resources.displayMetrics.densis
获取密度乘数。
Kotlin
LocalContext.current.resources.displayMetrics.density
To get the density multiplier.
在 Android 中,您可以像这样获得屏幕密度:
在 Kotlin 中,像这样:
确保定期 检查是否添加了新密度。
In Android you can get the screen density like this:
And in Kotlin like this:
Make sure to regularly check if new densities are added.
对于 Jetpack compose,首先获取可组合函数内的屏幕密度,然后
像其他答案一样关闭密度值
For Jetpack compose first get the screen density inside a composable function with
then switch off the density value like the other answers
我使用以下代码从模块访问 DPI(不需要访问上下文对象):
I am using following code to access DPI from modules (no need for having access to a context object):