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.