Estou tentando aplicar uma animação a uma exibição no meu aplicativo Android depois que minha atividade é criada. Para fazer isso, preciso determinar o tamanho atual da exibição e configurar uma animação para escalar do tamanho atual para o novo tamanho. Essa parte deve ser feita em tempo de execução, pois a visualização é dimensionada para tamanhos diferentes, dependendo da entrada do usuário. Meu layout é definido em XML.
Parece uma tarefa fácil, e há muitas perguntas sobre SO, embora nenhuma que tenha resolvido meu problema, obviamente. Então talvez eu esteja perdendo algo óbvio. Eu entendo o meu ponto de vista por:
ImageView myView = (ImageView) getWindow().findViewById(R.id.MyViewID);
Esta multa funciona, mas quando chamado getWidth()
, getHeight()
, getMeasuredWidth()
, getLayoutParams().width
, etc., todos eles retornam 0. Eu também tentou manualmente chamando measure()
na visão seguido por uma chamada para getMeasuredWidth()
, mas isso não tem efeito.
Eu tentei chamar esses métodos e inspecionar o objeto no depurador em meus da atividade onCreate()
e no onPostCreate()
. Como posso descobrir as dimensões exatas dessa exibição em tempo de execução?
fonte
match_parent
). Nesse caso, uma solução mais simples que pode ser chamada com segurança mesmo antes de o View ser desenhado (por exemplo, do método onCreate () da sua Activity) é apenas para usar Display.getSize (); consulte stackoverflow.com/a/30929599/5025060 para obter detalhes. Sei que não é o que o @NikReiman pediu, apenas deixando uma nota para aqueles que podem usar esse método mais simples.Respostas:
Use o ViewTreeObserver no modo de exibição para aguardar o primeiro layout. Somente após o primeiro layout o getWidth () / getHeight () / getMeasuredWidth () / getMeasuredHeight () funcionará.
fonte
removeGlobalOnLayoutListener(this);
? porque está obsoleto.Na verdade, existem várias soluções, dependendo do cenário:
Uso da amostra:
Se você souber o tamanho do contêiner:
Se você escreve no Kotlin, pode usar a próxima função, que nos bastidores funciona exatamente como
runJustBeforeBeingDrawn
eu escrevi:Observe que você precisa adicionar isso ao gradle (encontrado aqui ):
fonte
OnPreDrawListener
. Caso testado quando você deseja executar o código do ActivityonCreate()
e você imediatamente em segundo plano. Fácil de repetir, especialmente em dispositivos mais lentos. Se você substituirOnPreDrawListener
porOnGlobalLayoutListener
- você não verá o mesmo problema.ViewTreeObserver
oupost
, no meu caso, o número 2 ajudou (view.measure
).Você está ligando
getWidth()
antes que a visualização seja realmente exibida na tela?fonte
onSizeChange()
evento e saber o tamanho real? Isso parece um pouco exagerado ... embora neste momento eu esteja desesperado apenas para fazer o código funcionar, então vale a pena tentar.onPostCreate()
qual é executado depois que a exibição é completamente criada e iniciada.Com base nos conselhos de @ mbaird, encontrei uma solução viável subclassificando a
ImageView
classe e substituindoonLayout()
. Em seguida, criei uma interface de observação que minha atividade implementou e passou uma referência para si própria para a classe, o que lhe permitiu informar a atividade quando realmente terminou o dimensionamento.Não estou 100% convencido de que esta é a melhor solução (portanto, ainda não estou marcando esta resposta como correta), mas funciona e, de acordo com a documentação, é a primeira vez que se pode encontrar o tamanho real de uma exibição.
fonte
Aqui está o código para obter o layout, substituindo uma exibição se a API <11 (a API 11 inclui o recurso View.OnLayoutChangedListener):
fonte
Você pode verificar esta pergunta . Você pode usar o
View
's pós () método.fonte
Use o código abaixo, é o tamanho da visualização.
fonte
Isso funciona para mim no meu
onClickListener
:fonte
Eu também estava perdido em torno
getMeasuredWidth()
egetMeasuredHeight()
getHeight()
egetWidth()
por um longo tempo .......... depois eu descobri que a obtenção de largura e altura da vista emonSizeChanged()
é a melhor maneira de fazer isso ........ você pode dinamicamente obtenha sua largura e altura ATUAL da sua visualização substituindo oonSizeChanged(
método).pode querer dar uma olhada nisso, que tem um trecho de código elaborado. Nova postagem no blog: como obter as dimensões de largura e altura de um customView (estende o View) no Android http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.html
fonte
Você pode obter a posição e a dimensão da visualização na tela
fonte
funciona perfekt para mim:
fonte