【问题标题】:Android specifying pixel units (like sp, px, dp) without using XMLAndroid 在不使用 XML 的情况下指定像素单位(如 sp、px、dp)
【发布时间】:2016-09-22 00:12:17
【问题描述】:

是否可以在代码中指定像素单位。 我的意思是,假设我有一个布局并且我希望大小为 20dp,那么有没有办法在不写布局 xml 的情况下这样做

【问题讨论】:

标签: android android-layout pixel


【解决方案1】:

在视图中:

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's answer 指出的那样,您可以使用实用程序类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() 的计算与我上面的代码完全相同。使用哪个版本取决于您的编码风格。

【讨论】:

  • 总而言之,这就是框架所做的。这样可以确保大小永远不会是 0px。
  • @sebrock - 因为 OP 希望大小为 20dp 并以浮点数开头,从而在两行后计算 pixels 时消除了 int 到浮点数的转换。
  • 很想提出一个老话题,但我有一个问题。如果我有一个值存储在我希望 dp 等于的变量中。例如,如果我有一个随机值存储在变量 num 中,我如何用 numf 替换 20f。
  • @MikeT - 我不太明白这个问题。如果您想使用我发布的示例代码,只需使用变量而不是dp(或将dp 分配给变量的值:float dp = randomVariable;)。
  • @wviana - 您将在最后一行使用metrics.scaledDensity 而不是metrics.density。我将更新答案以包含该信息。感谢您的提问。
【解决方案2】:

你可以使用

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

现在,pixels 的值相当于20dp

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2015-06-22
    • 2011-01-25
    • 2012-01-08
    • 2017-07-29
    • 1970-01-01
    • 2019-08-03
    相关资源
    最近更新 更多