Qual é a diferença entre getWidth / Height () e getMeasuredWidth / Height () no Android SDK?

88

A documentação do Android diz que existem dois tamanhos para uma vista, as dimensões medidas e as dimensões do desenho . A dimensão medida é aquela calculada na passagem de medida (o método onMeasure ), enquanto as dimensões do desenho são o tamanho real na tela. Particularmente, a documentação diz que:

Esses valores podem, mas não necessariamente, ser diferentes da largura e altura medidas.

Então, minha pergunta é: o que poderia fazer a dimensão do desenho ser diferente da dimensão medida? Se o método onMeasure (int, int) respeitar os requisitos de layout (dados como os parâmetros widthMeasureSpec e heightMeasureSpec , como o SDK pode decidir que a visualização deve ter um tamanho de desenho diferente?

Além disso, como / onde no código-fonte do Android a largura / altura medida é usada para calcular a largura / altura do desenho? Tentei examinar o código-fonte do View , mas não consigo descobrir como a MeasWidth / Height é usada para calcular a largura / altura final. Talvez tenha algo a ver com o enchimento, mas não tenho certeza.

lgfischer
fonte
Acho que essas medidas podem ser diferentes caso um pergaminho seja adicionado à visualização.
Yury
Talvez, mas desenvolvi um ViewGroup customizado, e isso está acontecendo no meu código. Não estou lidando com rolar até o ponto em que esse comportamento ocorre. Então eu acho que deveria haver mais do que apenas rolagem envolvido nisso.
lgfischer
Eu confirmo, eu desenvolvi um ViewGroup customizado também para forçar uma dada proporção de aspecto: eu forcei a largura e altura medidas (menor ou igual ao proposto), mas eu tive como resultado largura e altura reais não alteradas (não as medidas). Sem relação com o pergaminho. Eu realmente não consigo encontrar uma maneira de forçar a largura e altura reais.
ARLabs de

Respostas:

96

Como o nome sugere, a largura / altura medida é usada durante a fase de medição e layout.

Deixe-me dar um exemplo,

Um widget é solicitado a medir a si mesmo. O widget diz que deseja ter 200 px por 200 px. Esta é a largura / altura medida.

Durante a fase de layout, ou seja, no método onLayout. O método pode usar a largura / altura medida de seus filhos ou atribuir uma nova largura / altura chamando o método de layout da visualização.

digamos que o método onLayout chame childview.layout (0,0,150,150) agora a largura / altura da visualização é diferente da largura / altura medida.

Eu sugeriria não usar o método MeasuredWidth / height fora do onLayout.

para resumir.

  1. onMeasure -> configura MeasuredWidth / MeasHeight
  2. onLayout -> configura a largura / altura do widget.

além disso,
public void View.layout(int l, int t, int r, int b)
parece ser o lugar onde a atribuição de posição e tamanho acontece.

Prakash Nadar
fonte
ou seja, devemos sempre usar getWidth / getHeight para obter a dimensão "real" de uma View, certo?
suitianshi
1
Sim, mas se você estiver fazendo seu próprio layout, deverá usar MeasWidth em vez de width.
Prakash Nadar
Então, qual é o propósito de definir dimensões dentro de onMeasure ()? Quer dizer, a passagem de layout é a última, em que você define as dimensões finais da visualização, possivelmente independentemente das dimensões medidas
edoardotognoni
@edoardotognoni depende até o layout (LinearLayout, RelativeLayout ou seu layout personalizado), para dar o tamanho e posição corretos para a visualização.
Prakash Nadar
Ok, digamos que a visualização diga "Eu gostaria dessas dimensões". Enquanto o layout diz "Você terá essas dimensões". Está certo?
edoardotognoni