12

我想在xamarin.android的C# 代码中将 dp 转换为 px ,但我能找到的只是android studio 中的java 代码,这些代码在xamarin 中有一些问题。我尝试使用等价物,例如使用 Resources 而不是 getResources(),我可以解决一些小问题,但是有一些问题我找不到任何等价物。以下是 xamarin 中的原始代码、我的代码和我的代码问题:

第一个代码

(从Programatically set height on LayoutParams as density-independent pixels 中找到)

爪哇代码

int height = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, < HEIGHT >, getResources().getDisplayMetrics());

C# 代码

int height = (int)TypedValue.ApplyDimension(TypedValue.COMPLEX_UNIT_DIP, < HEIGHT >, Resources.DisplayMetrics);

问题:

  • “TypedValue”不包含“COMPLEX_UNIT_DIP”的定义

  • 无效的表达式术语 <(> 的相同错误)

  • 当前上下文中不存在名称“HEIGHT”

第二个代码

(从公式 px 到 dp,dp 到 px android 中找到)

爪哇代码

DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));

C# 代码

DisplayMetrics displayMetrics = Application.Context.Resources.DisplayMetrics;
int pixel = Math.Round(dp * (displayMetrics.Xdpi / DisplayMetrics.DensityDefault));

问题

  • 运算符“/”不能应用于“float”和“DisplayMetricsDensity”类型的操作数

现在我实际上有两个问题。哪个代码更合适?xamarin.android 中它们的等效代码是什么?

提前致谢。

4

4 回答 4

17

“第一个代码”的解决方案:

Xamarin 倾向于将常量移动到它们自己的枚举中。COMPLEX_UNIT_DIP 可以在 ComplexUnitType 枚举中找到。此外,您的代码中不能有 < HEIGHT >,您实际上需要传入 dips 以获得等效的像素值。在下面的示例中,我得到了 100 个下降的像素。

var dp = 100;
int pixel = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, dp, Context.Resources.DisplayMetrics);

“第二个代码”的解决方案:

您需要将“DisplayMetrics.DensityDefault”显式转换为浮点数,并将整轮转换为 int:

int pixel = (int)System.Math.Round(dp * (displayMetrics.Xdpi / (float)DisplayMetrics.DensityDefault));

我更喜欢第一种方法,因为第二种代码专门用于沿“x 维度”计算:根据 Android 文档和Xamarin.Android文档,Xdpi 属性是

“X 维度上每英寸屏幕的精确物理像素。”

于 2016-11-28T09:06:52.930 回答
10

这些来自我目前正在从事的项目。

public static float pxFromDp(Context context, float dp)
{
    return dp * context.Resources.DisplayMetrics.Density;
}

public static float dpFromPx(Context context, float px)
{
    return px / context.Resources.DisplayMetrics.Density;
}
于 2016-11-28T14:16:14.603 回答
0

来自android源码textview settextsize

var convertToDp = TypedValue.ApplyDimension( ComplexUnitType.Dip, size, context.Resouces.DisplayMetrics);
于 2021-01-26T06:02:47.647 回答
-1

dp 到 px:


    DisplayMetrics displayMetrics = Application.Context.Resources.DisplayMetrics;
    double pixel = Math.Round((dp * DisplayMetrics.DensityDefault) + 0.5);

答案取自这里:https ://stackoverflow.com/a/8490361/6949388

抱歉,没有足够的代表发表评论。

于 2016-11-26T14:36:59.580 回答