在Android中,如何在不使用XML的情况下指定像素单位(例如sp、px、dp)?

7

在代码中指定像素单位是否可行?我的意思是,假设我有一个布局,并且我想要大小为20dp,那么是否有任何方法可以在不编写布局XML的情况下实现?


正确的现代答案:https://dev59.com/ZnA75IYBdhLWcg3wZ4Jr#66459077 - Fattie
2个回答

29
在一个视图中:
DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
float dp = 20f;
float fpixels = metrics.density * dp;
int pixels = (int) (fpixels + 0.5f);
在Activity中,当然不需要使用getContext()。要将缩放像素(sp)转换为像素,只需使用metrics.scaledDensity而不是metrics.density即可。
编辑:正如@Santosh的回答所指出的那样,您可以使用实用程序类TypedValue来完成相同的事情:
DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
float dp = 20f;
float fpixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
int pixels = Math.round(fpixels);

对于sp,用TypedValue.COMPLEX_UNIT_SP代替TypedValue.COMPLEX_UNIT_DIP

内部上,applyDimension()和我上面的代码做了完全相同的计算。使用哪个版本是你编码风格的问题。


3
总之,这就是该框架的作用。这可以确保大小永远不会为0像素。 - Romain Guy
@sebrock - 因为 OP 想要大小为 20dp,而一开始就将其设置为浮点数可以在两行后计算“像素”时消除 int-to-float 转换。 - Ted Hopp
抱歉提起一个旧话题,但我有一个问题。如果我有一个存储在变量中的值,我希望 DP 等于它。例如,如果我有一个随机值存储在变量 num 中,我该如何用 numf 替换 20f? - MikeC
@MikeT - 我不太明白问题所在。如果你想使用我发布的示例代码,只需使用变量而不是 dp(或将 dp 赋值为你的变量值:float dp = randomVariable;)。 - Ted Hopp
1
@wviana - 在最后一行中,您应该使用metrics.scaledDensity而不是metrics.density。我会更新答案以包含这些信息。谢谢您的提问。 - Ted Hopp
@Fattie - 这是一个很好的解决方案来设置文本大小。但它并不适用于其他情况(比如在代码中设置布局尺寸)。此外,该API调用自Android 1以来就存在了,所以对于2021年来说并不新鲜。 - Ted Hopp

4

您可以使用

float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics());

现在,pixels的值相当于20dp

TypedValue包含其他类似的方法,有助于转换


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接