将像素转换为 dp
我已经为分辨率为 480x800 的 Pantech 设备创建了应用程序,高度和宽度以像素为单位。
我需要转换 G1 设备的高度和宽度。
我认为将其转换为 dp 可以解决问题并为两种设备提供相同的解决方案。
有没有简单的方法将像素转换为 dp?
有什么建议吗?
I have created my application with the height and width given in pixels for a Pantech device whose resolution is 480x800
.
I need to convert height and width for a G1 device.
I thought converting it into dp will solve the problem and provide the same solution for both devices.
Is there any easy way to convert pixels to dp?
Any suggestions?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(30)
Java 代码:
Kotlin 代码:
Kotlin 扩展:
Java code:
Kotlin code:
Kotlin extension:
最好放在 Util.java 类中
Preferably put in a Util.java class
密度
等于ldpi
上的.75
(120
dpi)1.0
() mdpi
(160
dpi;基线)1.5
,hdpi
(240
dpi)2.0
,xhdpi
(320
dpi)3.0
,xxhdpi
(480
) dpi)4.0
onxxxhdpi
(640
dpi)使用此 在线转换器来使用 dpi 值。
编辑:
看起来
dpi
存储桶和密度
之间不存在1:1的关系。看起来Nexus 5X
的xxhdpi
的密度
值为2.625
(而不是3< /代码>)。请自行查看设备指标。
density
equals.75
onldpi
(120
dpi)1.0
onmdpi
(160
dpi; baseline)1.5
onhdpi
(240
dpi)2.0
onxhdpi
(320
dpi)3.0
onxxhdpi
(480
dpi)4.0
onxxxhdpi
(640
dpi)Use this online converter to play around with dpi values.
EDIT:
It seems there is no 1:1 relationship between
dpi
bucket anddensity
. It looks like theNexus 5X
beingxxhdpi
has adensity
value of2.625
(instead of3
). See for yourself in the Device Metrics.您可以使用这个..没有上下文
正如@Stan提到的..如果系统改变密度,使用这种方法可能会导致问题。所以要注意这一点!
就我个人而言,我使用 Context 来做到这一点。这只是我想与您分享的另一种方法
You can use this .. without Context
As @Stan mentioned .. using this approach may cause issue if system changes density. So be aware of that!
Personally I am using Context to do that. It's just another approach I wanted to share you with
如果您可以使用维度 XML,那就非常简单了!
在您的
res/values/dimens.xml
中:然后在您的 Java 中:
If you can use the dimensions XML it's very simple!
In your
res/values/dimens.xml
:Then in your Java:
根据 Android 开发指南:
但当您收到以像素为单位的设计时,您通常会希望以相反的方式执行此操作。因此:
如果您使用的是 240dpi 设备,则该比率为 1.5(如前所述),因此这意味着 60px 图标等于应用程序中的 40dp。
According to the Android Development Guide:
But often you'll want do perform this the other way around when you receive a design that's stated in pixels. So:
If you're on a 240dpi device this ratio is 1.5 (like stated before), so this means that a 60px icon equals 40dp in the application.
没有
Context
,优雅的静态方法:Without
Context
, elegant static methods:使用 kotlin-extension 使其更好
更新:
因为
displayMetrics
是 全局共享资源,我们可以使用Resources.getSystem()
PS:根据@EpicPandaForce的评论:
using kotlin-extension makes it better
UPDATE:
Because of
displayMetrics
is part of global shared Resources, we can useResources.getSystem()
PS: According to @EpicPandaForce's comment:
对于
DP 到像素
在
dimens.xml
中创建一个值在
pixel
中获取该值,如下所示:For
DP to Pixel
Create a value in
dimens.xml
Get that value in
pixel
as:对于任何使用 Kotlin 的人:
用法:
For anyone using Kotlin:
Usage:
因此,您可以使用以下公式根据 dp 中指定的尺寸计算正确的像素数量
You can therefore use the following formulator to calculate the right amount of pixels from a dimension specified in dp
android SDK中有一个默认的util:
http://developer.android.com/reference/android/util/TypedValue.html
There is a default util in android SDK:
http://developer.android.com/reference/android/util/TypedValue.html
科特林
Java
Kotlin
Java
这应该为您提供 dp 到像素的转换:
这应该为您提供 dp 的转换像素:
This should give you the conversion dp to pixels:
This should give you the conversion pixels to dp:
如果您在values/dimen中拥有尺寸,最好的方法可能是直接从getDimension()方法获取尺寸,它将返回已经转换为像素值的尺寸。
为了更好地解释这一点,
将返回已转换为像素的尺寸作为浮点数。
将返回相同的值,但被截断为 int,所以 AS AN
整数。
请参阅 Android 参考
Probably the best way if you have the dimension inside values/dimen is to get the dimension directly from getDimension() method, it will return you the dimension already converted into pixel value.
Just to better explain this,
will return the dimension already converted to pixel AS A FLOAT.
will return the same but truncated to int, so AS AN
INTEGER.
See Android reference
科特林:
Java:
Kotlin:
Java:
像这样:
依赖于上下文,返回浮点值,静态方法
来自: https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15
like this:
dependent on Context, return float value, static method
from: https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15
如果您开发性能关键型应用程序,请考虑以下优化类:
In case you developing a performance critical application, please consider the following optimized class:
要将像素转换为 dp,请使用 TypedValue 。
正如文档中提到的:动态类型数据值的容器。
并使用 applyDimension 方法:
它将保存维度的解包复杂数据值转换为其最终浮点值,如下所示:
希望有所帮助。
to convert Pixels to dp use the TypedValue .
As the documentation mentioned : Container for a dynamically typed data value .
and use the applyDimension method :
which Converts an unpacked complex data value holding a dimension to its final floating point value like the following :
Hope that Helps .
这对我来说是这样的:
你可以对宽度做同样的事情。
This is how it works for me:
You can do the same for the width.
上面有很多很棒的解决方案。然而,我发现的最好的解决方案是谷歌的设计:
https://design.google.com/devices/
A lot of great solutions above. However, the best solution I found is google's design:
https://design.google.com/devices/
使用 kotlin 的扩展函数的更优雅的方法
用法:
More elegant approach using kotlin's extension function
Usage:
PX
和DP
不同但相似。DP
是仅考虑屏幕物理尺寸时的分辨率。当您使用DP
时,它会将您的布局缩放到具有不同像素
密度的其他类似尺寸的屏幕。有时您实际上需要
像素
,并且当您在代码中处理尺寸时,您总是在处理真实的像素
,除非您转换它们。因此,在 Android 设备上,正常尺寸的 hdpi 屏幕上,800x480 在 DP 中是 533x320(我相信)。将
DP
转换为像素/1.5
,再转换回*1.5
。这仅适用于一种屏幕尺寸和 dpi,它会根据设计而变化。不过,我们的艺术家给了我像素
,然后我用上面的1.5
方程转换为DP
。PX
andDP
are different but similar.DP
is the resolution when you only factor the physical size of the screen. When you useDP
it will scale your layout to other similar sized screens with differentpixel
densities.Occasionally you actually want
pixels
though, and when you deal with dimensions in code you are always dealing with realpixels
, unless you convert them.So on a android device, normal sized
hdpi
screen,800x480 is 533x320
inDP
(I believe). To convertDP
intopixels /1.5
, to convert back*1.5
. This is only for the one screen size anddpi
, it would change depending on design. Our artists give mepixels
though and I convert toDP
with the above1.5
equation.将 dp 转换为像素
将像素转换为 dp。
其中资源是 context.getResources()。
To convert dp to pixel
To convert pixel to dp.
where resource is context.getResources().
您应该像使用像素一样使用 dp。这就是它们的全部;显示独立像素。使用与中密度屏幕上相同的数字,在高密度屏幕上尺寸将神奇地正确。
但是,听起来您需要的是布局设计中的 fill_parent 选项。当您希望视图或控件扩展到父容器中的所有剩余大小时,请使用 fill_parent。
You should use dp just as you would pixels. That's all they are; display independent pixels. Use the same numbers you would on a medium density screen, and the size will be magically correct on a high density screen.
However, it sounds like what you need is the fill_parent option in your layout design. Use fill_parent when you want your view or control to expand to all the remaining size in the parent container.
如果您想要整数值,那么使用 Math.round() 会将浮点四舍五入到最接近的整数。
If you want Integer values then using Math.round() will round the float to the nearest integer.
最好的答案来自Android框架本身:只需使用这个等式...
(将dp转换为px)
The best answer comes from the Android framework itself: just use this equality...
(converts dp to px)