SetWidth (int pixels) usa dip o px?


Risposte:


221

Usa i pixel, ma sono sicuro che ti stai chiedendo come usare invece i tuffi. La risposta è dentro TypedValue.applyDimension(). Ecco un esempio di come convertire i tuffi in px nel codice:

// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));

64
Puoi anche chiamare nbDips * getResources (). GetDisplayMetrics (). Density
Romain Guy

9
In effetti, questo è esattamente ciò che fa TypedValue.applyDimension (). Ho pensato di pubblicarlo, ma mi piace passare attraverso l'API nel caso in cui qualcosa cambi ... anche se immagino che sia sicuro usare quel metodo se gli dai l'ok. :)
Dan Lew

12
La versione applyDimension () esegue più codice e trovo un po 'più difficile da leggere. FWIW, la riga che ho pubblicato è ciò che effettivamente utilizziamo ovunque nel framework e nelle app standard.
Romain Guy

1
Ciao, ho provato i due esempi precedenti e non sembra calcolare correttamente i pixel. invece, mi restituisce il valore esatto che ho specificato nella mia vista: android: layout_width = "50dip" nel mio caso. mi restituirà 50 il valore esatto nel file xml. Ho quindi controllato nell'app e, come previsto, il valore non è corretto e la vista è troppo grande del previsto
Jonathan

L'unica soluzione che ho trovato per la conversione da px a pt, molto bella.
A-Live

24

Il modo corretto per ottenere un numero costante di DIP nel codice è creare un file XML delle risorse contenente valori dp un po 'come:

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

Quindi fai riferimento alla risorsa nel tuo codice in questo modo:

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

Il float restituito verrà ridimensionato di conseguenza per la densità di pixel del dispositivo e quindi non è necessario continuare a replicare un metodo di conversione in tutta l'applicazione.


Nella mia situazione, questa soluzione funziona meglio dove ho una finestra di dialogo personalizzata che ha un listview e desidero impostare la larghezza delle etichette di intestazione e delle colonne in ListView alla stessa larghezza.
Wayne Phipps

La tua prima frase è piuttosto divertente, in pratica stai dicendo che creare un file XML è il modo corretto per "specificare [qualcosa] nel codice" . Beh, penso che tu stia semplicemente usando la costante nel codice senza specificarla :)
Joffrey

@Joffrey si capisco cosa intendi quindi ho aggiornato leggermente la formulazione
SDJMcHattie

7

Metodo setWidth (100), imposta 100 px come larghezza (non in dp) .Quindi potresti incontrare problemi di larghezza variabile su diversi telefoni Android.Quindi usa la misurazione in dp invece di pixel.Usa il codice sottostante per ottenere la misurazione in dp della larghezza del campione = 300 px e altezza = 400 px.

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

int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());


0

Pixel ovviamente, il metodo richiede pixel come parametro.


1
Se è nel file xml di layout, possiamo specificare android: layout_width = "100dip" o android: layout_width = "100px". Nel codice sorgente, non possiamo specificare la larghezza di un layout come 100dip?
user256239

Non direttamente, devi convertirti usando DisplayMetrics.density.
Romain Guy

0

Sulla base delle risposte di cui sopra che funziona bene per me, ho generare alcuni metodi di supporto , basta aggiungerle alla utils di utilizzarli in tutto il progetto.

   // 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());
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.