如何以编程方式从android中的像素计算dp

Daw*_*yży 120 android resolution android-layout

我想dppx编程上计算.怎么做?我得到的答案是:

DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
ht = displaymetrics.heightPixels;
wt = displaymetrics.widthPixels;
Run Code Online (Sandbox Code Playgroud)

Vic*_*ani 334

这里的所有答案都显示了dp-> px转换而不是px-> dp,这是OP要求的.请注意,TypedValue.applyDimension不能用于转换px-> dp,因为必须使用此处描述的方法:https://stackoverflow.com/a/17880012/504611(为方便起见,引用如下).

没有Context,优雅的静态方法:

public static int dpToPx(int dp) {
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

public static int pxToDp(int px) {
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案 (45认同)
  • 使用 toInt() 方法代替 Kotlin 的强制转换。 (2认同)

Vla*_*mir 53

float ht_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ht, getResources().getDisplayMetrics());
float wt_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, wt, getResources().getDisplayMetrics());
Run Code Online (Sandbox Code Playgroud)

  • 问题是关于"px - > dp",但代码看起来像"dp - > px"?(注意LHS中的'_px'后缀) (18认同)
  • 您可以通过任何方式将第一个参数从 `TypedValue.COMPLEX_UNIT_DIP` 更改为 `TypedValue.COMPLEX_UNIT_PX`,以便转换 `dp-> px` (3认同)
  • @NullnVoid:那行不通。如果您看到 [`TypedValue.applyDimension` 的文档](https://developer.android.com/reference/android/util/TypedValue.html#applyDimension(int,%20float,%20android.util.DisplayMetrics)),它说:“将包含维度的解压缩复杂数据值转换为其最终浮点值”,即返回值始终以 px 为单位。所以如果你通过 `TypedValue.COMPLEX_UNIT_PX` 它只会做一个 px->px 的“转换”,也就是说,什么都没有。 (2认同)

kas*_*rch 40

这应该给你转换像素 - > dp:

DisplayMetrics displaymetrics = new DisplayMetrics();
int dp = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, myPixels, displaymetrics );
Run Code Online (Sandbox Code Playgroud)

  • **你正在做的是dp-> px转换.**[TypedValue.applyDimension`的文档](http://developer.android.com/reference/android/util/TypedValue.html#applyDimension% 28int,%20float,%20android.util.DisplayMetrics%29)说第一个参数是转换_from_的单位,返回值是"复杂浮点值乘以适当的指标,具体取决于其单位".`applyDimension`不能用于转换px-> dp,因为你必须按照这里描述的那样去做:http://stackoverflow.com/a/17880012/504611 (46认同)