SetWidth (int pixels) utilise-t-il dip ou px?

Réponses:

221

Il utilise des pixels, mais je suis sûr que vous vous demandez comment utiliser les creux à la place. La réponse est là TypedValue.applyDimension(). Voici un exemple de conversion de creux en px dans le code:

// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));
Dan Lew
la source
64
Vous pouvez également appeler nbDips * getResources (). GetDisplayMetrics (). Density
Romain Guy
9
En fait, c'est exactement ce que fait TypedValue.applyDimension (). J'ai envisagé de publier cela, mais j'aime passer par l'API au cas où quelque chose changerait ... même si je suppose que c'est sûr d'utiliser cette méthode si vous lui donnez le droit. :)
Dan Lew
12
La version applyDimension () exécute plus de code et je trouve un peu plus difficile à lire. FWIW, la ligne que j'ai publiée est ce que nous utilisons réellement partout dans le cadre et les applications standard.
Romain Guy
1
Salut, j'ai essayé les deux exemples ci-dessus et il ne semble pas calculer correctement les pixels. au lieu de cela, il me renvoie la valeur exacte que je spécifie dans ma vue: android: layout_width = "50dip" dans mon cas. il me renverra 50 la valeur exacte dans le fichier xml. J'ai ensuite vérifié cela dans l'application et comme prévu, la valeur est incorrecte et dessine la vue trop grande que prévue
Jonathan
La seule solution que j'ai trouvée pour la conversion px en pt, très sympa.
A-Live du
24

La bonne façon d'obtenir un nombre constant de DIP dans le code est de créer un fichier XML de ressources contenant des valeurs de dp un peu comme:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="image_width">100dp</dimen>
    <dimen name="image_height">75dp</dimen>
</resources>

Puis référez-vous à la ressource dans votre code comme ceci:

float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));

Le flottant que vous avez renvoyé sera mis à l'échelle en fonction de la densité de pixels de l'appareil et vous n'avez donc pas besoin de continuer à répliquer une méthode de conversion dans toute votre application.

SDJMcHattie
la source
Dans ma situation, cette solution fonctionne mieux lorsque j'ai une boîte de dialogue personnalisée qui a une vue de liste et que je souhaite définir la largeur des étiquettes d'en-tête et des colonnes de ListView à la même largeur.
Wayne Phipps
Votre première phrase est plutôt drôle, vous dites en gros que créer un fichier XML est la bonne façon de "spécifier [quelque chose] dans le code" . Eh bien, je pense que vous utilisez simplement la constante dans le code sans la spécifier :)
Joffrey
@Joffrey oui je vois ce que tu veux dire, alors j'ai légèrement mis à jour le libellé
SDJMcHattie
7

Méthode setWidth (100), définissez 100 px comme largeur (pas en dp) .Vous pouvez donc rencontrer des problèmes de largeur variable sur différents téléphones Android.Utilisez donc la mesure en dp au lieu de pixels.Utilisez le code ci-dessous pour obtenir une mesure en dp de la largeur de l'échantillon = 300px et hauteur = 400px.

int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());

int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());
Nidhin
la source
4
float dps = 100;
float pxs = dps * getResources().getDisplayMetrics().density;

Source (@Romain Guy)

pomber
la source
0

Pixels bien sûr, la méthode demande des pixels comme paramètre.

Josnidhin
la source
1
Si c'est dans un fichier xml de mise en page, nous pouvons spécifier android: layout_width = "100dip" ou android: layout_width = "100px". Dans le code source, nous ne pouvons pas spécifier la largeur d'une mise en page comme 100dip?
user256239
Pas directement, vous devez vous convertir en utilisant DisplayMetrics.density.
Romain Guy
0

Sur la base des réponses ci-dessus qui fonctionnent bien pour moi, je génère des méthodes d'aide , il suffit de les ajouter dans vos utils pour les utiliser dans tout le projet.

   // value in DP
   public static int getValueInDP(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInDP(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    // value in PX
    public static int getValueInPixel(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInPixel(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }
Abhishek Garg
la source