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

Rey*_*deh 10 pixel pixels xamarin.android density-independent-pixel xamarin

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

第一个代码

(从以编程方式将LayoutParams上的高度设置为与密度无关的像素)

java代码

int height = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, < HEIGHT >, getResources().getDisplayMetrics());
Run Code Online (Sandbox Code Playgroud)

C#代码

int height = (int)TypedValue.ApplyDimension(TypedValue.COMPLEX_UNIT_DIP, < HEIGHT >, Resources.DisplayMetrics);
Run Code Online (Sandbox Code Playgroud)

问题:

  • 'TypedValue'不包含'COMPLEX_UNIT_DIP'的定义

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

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

第二个代码

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

java代码

DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
Run Code Online (Sandbox Code Playgroud)

C#代码

DisplayMetrics displayMetrics = Application.Context.Resources.DisplayMetrics;
int pixel = Math.Round(dp * (displayMetrics.Xdpi / DisplayMetrics.DensityDefault));
Run Code Online (Sandbox Code Playgroud)

问题

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

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

提前致谢.

Ste*_*ord 13

解决"第一代码":

Xamarin倾向于将常量移动到自己的枚举中.COMPLEX_UNIT_DIP可以在ComplexUnitType枚举中找到.此外,您不能在代码中使用<HEIGHT>来实际传递dips以获得等效的像素值.在下面的示例中,我得到100个像素的像素.

var dp = 100;
int pixel = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, dp, Context.Resources.DisplayMetrics);
Run Code Online (Sandbox Code Playgroud)

解决"第二代码":

你需要显式地将'DisplayMetrics.DensityDefault'转换为float并将整个转换为int:

int pixel = (int)System.Math.Round(dp * (displayMetrics.Xdpi / (float)DisplayMetrics.DensityDefault));
Run Code Online (Sandbox Code Playgroud)

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

"X维度中每英寸屏幕的确切物理像素数."


Hei*_*erg 5

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

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 非常简单的解决方案,我使用的是 Xamarin.Forms (v2.3.4247) 的调整版本:`var dp=pixel* (int)Resources.System.DisplayMetrics.Density;` (2认同)