如何将xamarin.android中的dp转换为px?

How to convert dp to px in xamarin.android?

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

第一个密码

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

java代码

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'在当前上下文中不存在

第二个密码

(从 Formula px to dp, dp to px android 中找到)

java代码

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 中它们的等效代码是什么?

提前致谢。

dp 转 px:


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

答案取自此处:

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

"First code"的解决方案:

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

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

"Second code"的解决方法:

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

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

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

"The exact physical pixels per inch of the screen in the X dimension."

这些来自我目前正在进行的项目..

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;
}

来自android源代码textview settextsize

var convertToDp = TypedValue.ApplyDimension( ComplexUnitType.Dip, size, context.Resouces.DisplayMetrics);