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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.