如何在damarin.android?

时间:2016-11-26 14:09:11

标签: xamarin xamarin.android pixel pixels density-independent-pixel

我想在 xamarin.android 中的 C#代码中将dp转换为px,但我能找到的只是 java code 在android中工作室在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'的定义

  • 无效的表达式术语&lt; (&gt;的相同错误)

  • 当前上下文中不存在名称“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中它们的等效代码是什么?

提前致谢。

4 个答案:

答案 0 :(得分:13)

解决“第一个代码”

Xamarin倾向于将常量移动到自己的枚举中。 COMPLEX_UNIT_DIP可以在ComplexUnitType枚举中找到。你也不能拥有&lt;高度&gt;在你的代码中,你实际上需要传入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维度中每英寸屏幕的确切物理像素数。”

答案 1 :(得分: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;
}

答案 2 :(得分:0)

dp到px:

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

从这里回答:https://stackoverflow.com/a/8490361/6949388

对不起,没有足够的代表发表评论。

答案 3 :(得分:0)

来自android源代码textview settextsize

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