Как преобразовать dp в px в xamarin.андроид?

Я хочу преобразовать dp в px в моем C# код на в Xamarin.android, но все, что я смог найти java коды в Android studio это есть некоторые проблемы в Xamarin. Я попытался использовать эквивалент, как использование ресурсов вместо getResources (), и я мог бы решить некоторые небольшие проблемы, но есть некоторые проблемы, которые я не смог найти для них эквивалента. вот оригинальные коды, мои коды и мои проблемы с кодами в в Xamarin:

первый код

(нашли от программно установите высоту на LayoutParams как независимые от плотности пиксели)

код 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'

  • недопустимый термин выражения )

  • имя "высота" не существует в текущем контексте

код

(нашли от Формула px для dp, dp для 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));

3 ответов


решение "первый код":

Xamarin имеет тенденцию перемещать константы в свои собственные перечисления. COMPLEX_UNIT_DIP можно найти в перечислении ComplexUnitType. Также вы не можете иметь в коде, который вам действительно нужно передать в провалах, чтобы получить эквивалентное значение пикселя. в приведенном ниже примере я получаю пиксели в 100 провалах.

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

решение "второй код":

вам нужно явно бросить ' DisplayMetrics.DensityDefault на float и весь раунд до int:

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

Я предпочитаю первый подход, поскольку второй код специально предназначен для вычисления вдоль " измерения x": В Android docs и Xamarin.Android docs, свойство Xdpi является

" точные физические пиксели на дюйм экрана в X-измерении."


это проект, над которым я сейчас работаю..

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

dp к px:

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

ответ взят отсюда:https://stackoverflow.com/a/8490361/6949388

извините, недостаточно репутации для комментариев.