Qual è la differenza tra getWidth / Height () e getMeasuredWidth / Height () in Android SDK?


91

La documentazione di Android dice che ci sono due dimensioni per una vista, le dimensioni misurate e le dimensioni del disegno . La dimensione misurata è quella calcolata nel passaggio di misura (il metodo onMeasure ), mentre le dimensioni del disegno sono le dimensioni effettive sullo schermo. In particolare, la documentazione dice che:

Questi valori possono, ma non devono, essere diversi dalla larghezza e dall'altezza misurate.

Quindi, la mia domanda è: cosa potrebbe rendere la dimensione del disegno diversa dalla dimensione misurata? Se il metodo onMeasure (int, int) rispetta i requisiti di layout (dati come parametri widthMeasureSpec e heightMeasureSpec , come potrebbe l'SDK decidere che la vista dovrebbe avere una dimensione di disegno diversa?

Inoltre, come / dove nel codice sorgente di Android viene utilizzata la larghezza / altezza misurata per calcolare la larghezza / altezza del disegno? Ho provato a esaminare il codice sorgente della vista , ma non riesco a capire come viene utilizzata la larghezza / altezza misurata per calcolare la larghezza / altezza finale. Forse ha qualcosa a che fare con l'imbottitura, ma non ne sono sicuro.


Penso che queste misure possano essere diverse nel caso in cui venga aggiunta una pergamena alla vista.
— Yury

Forse, ma ho sviluppato un ViewGroup personalizzato e questo sta accadendo nel mio codice. Non ho a che fare con lo scorrimento fino al punto in cui si verifica questo comportamento. Quindi penso che dovrebbe esserci qualcosa di più dello scorrimento coinvolto in questo.
— lgfischer

Confermo, ho sviluppato anche un ViewGroup personalizzato per forzare un dato allungamento: ho forzato larghezza e altezza misurate (inferiori o uguali a quelle proposte), ma ho avuto come risultato larghezza e altezza reali non modificate (non quelle misurate). Nessuna relazione con lo scroll. Non riesco davvero a trovare un modo per forzare la larghezza e l'altezza reali.
— ARLabs

Risposte:


101

Come suggerisce il nome, la larghezza / altezza misurata viene utilizzata durante la fase di misurazione e layout.

Fammi fare un esempio,

A un widget viene chiesto di misurare se stesso, il widget dice che vuole essere 200px per 200px. Questo è misurato Larghezza / altezza.

Durante la fase di layout, cioè nel metodo onLayout. Il metodo può utilizzare la larghezza / altezza misurata dei suoi figli o assegnare una nuova larghezza / altezza chiamando il metodo di layout della vista.

diciamo che il metodo onLayout chiama childview.layout (0,0,150,150) ora la larghezza / altezza della vista è diversa dalla larghezza / altezza misurata.

Suggerirei di non utilizzare la larghezza / altezza misurata al di fuori del metodo onLayout.

riassumere .

  1. onMeasure -> imposta la larghezza / altezza misurata
  2. onLayout -> imposta la larghezza / altezza del widget.

Inoltre
public void View.layout(int l, int t, int r, int b)
sembra essere il luogo in cui avviene l'assegnazione di posizione e dimensione.


cioè, dovremmo sempre usare getWidth / getHeight per ottenere la dimensione "reale" di una vista, giusto?
— suitianshi

1
Sì, ma se stai realizzando il tuo layout, dovresti usare MeasureWidth invece di width.
— Prakash Nadar

Allora, qual è lo scopo di impostare le dimensioni all'interno di onMeasure ()? Voglio dire, il layout pass è l'ultimo, in cui imposti le dimensioni finali della vista, possibilmente indipendentemente dalle dimensioni misurate
— edoardotognoni

@edoardotognoni dipende dal layout (LinearLayout, RelativeLayout o layout personalizzato), per dare la dimensione e la posizione corrette alla vista.
— Prakash Nadar

Ok, diciamo che la vista dice "Vorrei queste dimensioni". Mentre il layout dice "Avrai queste dimensioni". È giusto?
— edoardotognoni
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.