Héc*_*ena 319 android dpi dimension android-resources
我想按原样加载值.我有两个dimension.xml文件,一个在/res/values/dimension.xml,另一个在/res/values-sw360dp/dimension.xml.
从源代码我想做的事情
getResources().getDimension(R.dimen.tutorial_cross_marginTop);
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我获得的值乘以屏幕密度系数(hdpi为1.5,xhdpi为2.0等).
我也试过
getResources().getString(R.dimen.tutorial_cross_marginTop);
Run Code Online (Sandbox Code Playgroud)
这原则上可行,但我得到一个以"dip"结尾的字符串......
And*_*cko 768
在我的dimens.xml中,我有
<dimen name="test">48dp</dimen>
Run Code Online (Sandbox Code Playgroud)
在代码中如果我这样做
int valueInPixels = (int) getResources().getDimension(R.dimen.test)
Run Code Online (Sandbox Code Playgroud)
这将返回72,当文档状态乘以当前手机的密度(在我的情况下为48dp x 1.5)
正如文档所述:
检索特定资源ID的维度.单位转换基于与资源关联的当前DisplayMetrics.
因此,如果您想要精确的dp值,就像在xml中一样,只需将其除以DisplayMetrics密度即可
int dp = (int) (getResources().getDimension(R.dimen.test) / getResources().getDisplayMetrics().density)
Run Code Online (Sandbox Code Playgroud)
dp现在是48
Ovi*_*tcu 19
该Resource班也有一个方法getDimensionPixelSize() ,我认为会满足您的需求.
Sur*_*gch 14
对于那些只需要int在资源中保存一些价值的人,您可以执行以下操作.
integers.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="default_value">100</integer>
</resources>
Run Code Online (Sandbox Code Playgroud)
码
int defaultValue = getResources().getInteger(R.integer.default_value);
Run Code Online (Sandbox Code Playgroud)
Nic*_*ico 10
这是一个更好的解决方案,不涉及从 dp 到 px 再从 px 到 dp 的双重转换:
fun Resources.getRawDimensionInDp(@DimenRes dimenResId: Int): Float {
val value = TypedValue()
getValue(dimenResId, value, true)
return TypedValue.complexToFloat(value.data)
}
// Usage:
resources.getRawDimensionInDp(R.dimen.my_dimen_id)
Run Code Online (Sandbox Code Playgroud)
public class ResourcesUtil {
static Float getRawDimensionInDp(Resources resources, @DimenRes int dimenResId) {
TypedValue value = new TypedValue();
resources.getValue(dimenResId, value, true);
return TypedValue.complexToFloat(value.data);
}
}
// Usage:
ResourcesUtil.getRawDimensionInDp(resources, R.dimen.my_dimen_id);
Run Code Online (Sandbox Code Playgroud)
您可以使用getDimensionPixelOffset()而不是getDimension,因此您不必转换为int.
int valueInPixels = getResources().getDimensionPixelOffset(R.dimen.test)
Run Code Online (Sandbox Code Playgroud)
您可以添加扩展来简化此过程。它使您只需调用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
Run Code Online (Sandbox Code Playgroud)
如果你想在没有上下文的情况下处理它,你可以使用Resources.getSystem():
val Int.dp get() = this / Resources.getSystem().displayMetrics.density // Float
val Int.px get() = (this * Resources.getSystem().displayMetrics.density).toInt()
Run Code Online (Sandbox Code Playgroud)
例如,在 xhdpi 设备上,使用24.dp获取 12.0 或12.px获取 24
你也可以在 xml 文件中写整数..
你见过 [this]
http://developer.android.com/guide/topics/resources/more-resources.html#Integer吗?用于 。
context.getResources().getInteger(R.integer.height_pop);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
181800 次 |
| 最近记录: |