web-dev-qa-db-fra.com

Comment convertir dp en px dans xamarin.android?

Je souhaite convertir dp en px dans mon code C # dans xamarin.Android, mais je n'ai trouvé que des codes Java dans le studio Android qui ont quelques problèmes avec xamarin. J'ai essayé d'utiliser un équivalent, par exemple utiliser Ressources au lieu de getResources () et je pouvais résoudre quelques petits problèmes, mais il y a encore des problèmes pour lesquels je ne trouve aucun équivalent. voici les codes originaux, mes codes et mes problèmes de codes dans xamarin:

Premier code

(trouvé à partir de Définissez par programme la hauteur sur LayoutParams en tant que pixels indépendants de la densité )

Code Java

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

Code C #

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

problèmes:

  • 'TypedValue' ne contient pas de définition pour 'COMPLEX_UNIT_DIP'

  • Terme d'expression non valide <(La même erreur pour>)

  • Le nom 'HEIGHT' n'existe pas dans le contexte actuel

Deuxième code

(trouvé à partir de Formule px à dp, dp à px Android )

Code Java

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

Code C #

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

problème

  • L'opérateur '/' ne peut pas être appliqué aux opérandes de type 'float' et 'DisplayMetricsDensity'

Maintenant, j'ai en fait deux questions. Quel code est le plus approprié? Quel est le code équivalent pour eux dans xamarin.android?

Merci d'avance.

10

Solution à "Premier code":

Xamarin a tendance à déplacer les constantes dans leurs propres enums. COMPLEX_UNIT_DIP peut être trouvé dans ComplexUnitType enum. De plus, vous ne pouvez pas avoir <HEIGHT> dans votre code, vous devez en fait passer des creux pour obtenir la valeur de pixel équivalente. dans l'exemple ci-dessous, je reçois des pixels en 100 trempettes. 

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

Solution à "Deuxième code":

Vous devez explicitement convertir 'DisplayMetrics.DensityDefault' en un nombre float et la totalité du tour en un entier:

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

Je préfère la première approche car le second code est spécifiquement destiné au calcul le long de la "dimension x": Selon les documents Android et Xamarin.Android docs, la propriété Xdpi est 

"Les pixels physiques exacts par pouce de l'écran dans la dimension X."

13
Steven Mark Ford

Celles-ci proviennent du projet sur lequel je travaille actuellement.

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

dp to px:

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

Réponse tirée d'ici: https://stackoverflow.com/a/8490361/6949388

Désolé, pas assez de rep pour commenter.

0
Mojo Allmighty