Android并以dp为单位以编程方式设置宽度和高度


304

我正在做:

button.setLayoutParams(new GridView.LayoutParams(65, 65));

根据文档,宽度和高度的单位(以上均为65)均为“像素”。您如何将其设置为与设备无关的像素或“ dp”?

Answers:


541

您必须使用显示比例因子将其从dps转换为像素。

final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);

111
正确的转换是(int)(dps *比例+ 0.5f)。这是我们在整个框架中使用的公式。
罗曼·盖伊

8
该公式在文档中。如要进一步了解,请转到第3 developer.android.com/guide/practices/...
SK9

34
@RomainGuy,能否请您向API添加实用程序函数以将转换dppx?谢谢。
2013年

3
DPS在这里是什么?即时通讯“ DPS无法解析为变量”错误?什么类型的“ dps”需要声明?
迪帕克

5
“ dps”变量是要转换的输入值。
罗比·庞德2014年

233

我知道这是一个老问题,但是我发现进行转换的方法更加简洁。

爪哇

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());

科特林

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)

8
做得好,发现如何做到这一点。我不喜欢在多个地方重复公式!谢谢。
darrenp

2
如果没有,则使用公式创建函数
Sayka

1
@Kenobi它为您完成从DP到PX的转换。在65上面的是你想转换到PX的DP值
drspaceboo

7
这应该是公认的答案,而不是当前的答案,这些数字(0.5)从无处神奇地来
Johny19'7

1
@ Johny19 0.5不是魔术。这就是将浮点数四舍五入到最接近的整数而不是将其截断的方法。有关更多详细信息,请参见我对Robby Pond答案的评论。
MarredCheese

38

根据您的要求,还有替代解决方案。看来您在编译时就知道dp中的尺寸,因此可以在资源中添加一个dimen条目。然后,您可以查询dimen条目,它将在此调用中自动转换为像素:

final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);

而且您的dimens.xml将具有:

<dimen name="dimen_entry_in_dp">72dp</dimen>

扩展这个想法,您可以简单地将1dp或1sp的值存储为dimen条目,并查询该值并将其用作乘数。使用这种方法,您可以将代码与数学知识隔离开,并依靠库来执行计算。


请注意,返回值实际上是一个整数,因此将其强制转换为浮点数。
CorayThan

这是一个错误的答案,因为票价动态变化
Johny19年

37

测试的最简单方法(甚至可以从api 1使用)是:

getResources().getDimensionPixelSize(R.dimen.example_dimen);

从文档中:

检索特定资源ID的尺寸,用作原始像素的尺寸。此方法与getDimension(int)相同,除了将返回值转换为整数像素以用作大小。大小转换涉及四舍五入基础值,并确保非零基础值的大小至少为一个像素。

是的,它对值进行了四舍五入,但是不是很糟糕(在ldpi不太常见的情况下,仅在hdpi和ldpi设备上为奇数值),我在xxhdpi设备中进行了测试,该设备将4dp转换为16(像素),即真正。

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.