从源代码中的res / values / dimension.xml加载维度值


337

我想按原样加载该值。我有两个dimension.xml文件,一个在/res/values/dimension.xml另一个/res/values-sw360dp/dimension.xml

从源代码,我想做类似的事情

getResources().getDimension(R.dimen.tutorial_cross_marginTop);

这可行,但是我得到的值乘以屏幕密度系数(对于hdpi为1.5,对于xhdpi等为2.0)。

我也试着做

getResources().getString(R.dimen.tutorial_cross_marginTop);

从原理上讲这可以工作,但是我得到一个以“ dip”结尾的字符串...


1
我想知道这是否是Android中的bug,因为Resources的方法getDimensionPixelSize(int id)确切地指出了它以Pixel返回,因此getDimension(int id)应该以dp(依赖于独立性的单位)返回,可以使用了,例如ViewsetPadding
Paul Verest,2014年

Answers:


811

在我的dimens.xml中,

<dimen name="test">48dp</dimen>

在代码中如果我这样做

int valueInPixels = (int) getResources().getDimension(R.dimen.test)

这将返回72,这是文档状态乘以当前电话的密度(在我的情况下为48dp x 1.5)

完全按照docs的说明:

检索特定资源ID的维度。单位转换基于与资源关联的当前DisplayMetrics。

因此,如果您想要精确的dp值,就像在xml中一样,只需将其除以DisplayMetrics密度即可

int dp = (int) (getResources().getDimension(R.dimen.test) / getResources().getDisplayMetrics().density)

dp现在是48


3
我认为文档在这里特别不清楚。“单位转换基于与资源关联的当前DisplayMetrics。” 他们只想说要转换为像素
Trilarion 2015年

如果您基本上要舍弃显示指标乘数,则也可以只以px为单位定义尺寸。<dimen name =“ test”> 48像素</ dimen>。getDimension(R.dimen.test)将返回48
迈克尔·彼得森


@Trilarion但是,它们不会简单地转换为像素。他们说这dp将给出相对于用于检索它的资源对象的比例的比例像素值。一旦您掌握了获取资源的各种方式,这将变得更加重要。为简单起见,您可以将其视为与屏幕比例相关。还有sp,或像素相对于系统文字大小,和px,或直接像素。每个都有不同,目的也不同。
被遗弃的购物车



14

对于那些只需要保存一些的人 int在资源中价值的人,您可以执行以下操作。

integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="default_value">100</integer>
</resources> 

int defaultValue = getResources().getInteger(R.integer.default_value);

2
谢谢您的支持,这更多的是我在寻找的东西,即使可能不是在寻找其他人,但是该解决方案实际上为我提供了对代码其他领域的一些了解
JamisonMan111 '17

11

您可以使用getDimensionPixelOffset()代替getDimension,因此不必强制转换为int。

int valueInPixels = getResources().getDimensionPixelOffset(R.dimen.test)


2
    This works but the value I get is multiplied times the screen density factor
  (1.5 for hdpi, 2.0 for xhdpi, etc).

我认为按分辨率获取值是很好的,但是如果您不想这样做,请以像素为单位……。

密度无关像素(dp)

在定义UI布局时应使用的虚拟像素单位,以密度独立的方式表示布局尺寸或位置。与密度无关的像素等效于160 dpi屏幕上的一个物理像素,这是系统为“中”密度屏幕假定的基线密度。在运行时,系统会根据需要透明地处理dp单位的任何缩放比例,based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels.在定义应用程序的UI时应始终使用dp单位,以确保在不同密度的屏幕上正确显示UI。

我认为最好根据分辨率更改值,但是如果您不想这样做,请以px .......表示。

参考此链接

按照这个

dp

与密度无关的像素-基于屏幕物理密度的抽象单位。这些单位相对于160 dpi(每英寸的点数)屏幕,在该屏幕上1dp大约等于1px。When running on a higher density screen, the number of pixels used to draw 1dp is scaled up by a factor appropriate for the screen's dpi. Likewise, when on a lower density screen, the number of pixels used for 1dp is scaled down.dp与像素的比率将随屏幕密度而变化,但不一定成正比。使用dp单位(而不是px单位)是一种简单的解决方案,可以针对不同的屏幕密度正确调整布局中的视图尺寸。换句话说,它为跨不同设备的UI元素的实际大小提供了一致性。

像素

像素-对应于屏幕上的实际像素。不建议使用此度量单位,因为实际表示可能会因设备而异。每个设备每英寸可能具有不同数量的像素,并且屏幕上可用的总像素可能更多或更少。


2

使用Kotlin扩展

您可以添加扩展以简化此过程。它使您可以调用context.dp(R.dimen. tutorial_cross_marginTop)来获取Float值

fun Context.px(@DimenRes dimen: Int): Int = resources.getDimension(dimen).toInt()

fun Context.dp(@DimenRes dimen: Int): Float = px(dimen) / resources.displayMetrics.density

如果要在没有上下文的情况下进行处理,则可以使用Resources.getSystem()

val Int.dp get() = this / Resources.getSystem().displayMetrics.density // Float

val Int.px get() = (this * Resources.getSystem().displayMetrics.density).toInt()

例如,在xhdpi设备上,使用24.dp获取12.0或12.px获取24

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.