J'essaie d'appliquer une animation à une vue dans mon application Android après la création de mon activité. Pour ce faire, je dois déterminer la taille actuelle de la vue, puis configurer une animation à l'échelle de la taille actuelle à la nouvelle taille. Cette partie doit être effectuée au moment de l'exécution, car la vue est mise à l'échelle à différentes tailles en fonction de l'entrée de l'utilisateur. Ma mise en page est définie en XML.
Cela semble être une tâche facile, et il y a beaucoup de questions SO à ce sujet, mais aucune n'a résolu mon problème, évidemment. Alors peut-être que je manque quelque chose d'évident. Je saisis mon point de vue en:
ImageView myView = (ImageView) getWindow().findViewById(R.id.MyViewID);
Cela fonctionne très bien, mais lors de l' appel getWidth()
, getHeight()
, getMeasuredWidth()
, getLayoutParams().width
, etc., ils ont tous le retour 0. J'ai également essayé d' appeler manuellement measure()
sur la vue suivie d'un appel à getMeasuredWidth()
, mais cela n'a aucun effet.
J'ai essayé d'appeler ces méthodes et d'inspecter l'objet dans le débogueur dans mon activité onCreate()
et dans onPostCreate()
. Comment puis-je déterminer les dimensions exactes de cette vue au moment de l'exécution?
la source
match_parent
). Dans ce cas, une solution plus simple qui peut être appelée en toute sécurité avant même que la vue ne soit dessinée (par exemple, à partir de la méthode onCreate () de votre activité) consiste simplement à utiliser Display.getSize (); voir stackoverflow.com/a/30929599/5025060 pour plus de détails. Je sais que ce n'est pas ce que @NikReiman a demandé, laissant simplement une note à ceux qui pourraient utiliser cette méthode plus simple.Réponses:
Utilisez le ViewTreeObserver sur la vue pour attendre la première mise en page. Ce n'est qu'après la première mise en page que getWidth () / getHeight () / getMeasuredWidth () / getMeasuredHeight () fonctionnera.
la source
removeGlobalOnLayoutListener(this);
? car il est obsolète.Il existe en fait plusieurs solutions, selon le scénario:
Exemple d'utilisation:
Si vous connaissez la taille du conteneur:
Si vous écrivez en Kotlin, vous pouvez utiliser la fonction suivante, qui en coulisse fonctionne exactement comme
runJustBeforeBeingDrawn
celle que j'ai écrite:Notez que vous devez ajouter ceci à gradle (trouvé via ici ):
la source
OnPreDrawListener
. Cas testé lorsque vous souhaitez exécuter du code à partir d'activitéonCreate()
et que vous appliquez immédiatement en arrière-plan. Facile à répéter en particulier sur un appareil plus lent. Si vous remplacezOnPreDrawListener
parOnGlobalLayoutListener
- vous ne verrez pas le même problème.ViewTreeObserver
oupost
, dans mon cas, le numéro 2 a aidé (view.measure
).Appelez-vous
getWidth()
avant que la vue ne soit réellement présentée à l'écran?la source
onSizeChange()
événement et connaître la taille réelle? Cela semble un peu exagéré ... bien qu'à ce stade, je cherche désespérément à faire fonctionner le code, donc ça vaut le coup.onPostCreate()
lequel s'exécute une fois que la vue est complètement créée et démarrée.Sur la base des conseils de @ mbaird, j'ai trouvé une solution viable en sous-classant la
ImageView
classe et en la remplaçantonLayout()
. J'ai ensuite créé une interface d'observateur que mon activité a implémentée et passé une référence à elle-même à la classe, ce qui lui a permis de dire à l'activité quand elle avait réellement fini de dimensionner.Je ne suis pas convaincu à 100% que ce soit la meilleure solution (d'où je ne marque pas encore cette réponse comme correcte), mais cela fonctionne et selon la documentation, c'est la première fois que l'on peut trouver la taille réelle d'une vue.
la source
Voici le code pour obtenir la mise en page via le remplacement d'une vue si l'API <11 (l'API 11 inclut la fonctionnalité View.OnLayoutChangedListener):
la source
Vous pouvez vérifier cette question . Vous pouvez utiliser le
View
de » post () méthode.la source
Utilisez le code ci-dessous, cela donne la taille de la vue.
la source
Cela fonctionne pour moi dans mon
onClickListener
:la source
J'étais aussi perdu
getMeasuredWidth()
etgetMeasuredHeight()
getHeight()
etgetWidth()
pendant longtemps .......... plus tard, j'ai trouvé queonSizeChanged()
la meilleure façon de faire cela est d' obtenir la largeur et la hauteur de la vue ........ vous pouvez dynamiquement obtenez votre largeur ACTUELLE et votre hauteur ACTUELLE de votre vue en remplaçant laonSizeChanged(
méthode).pourrait vouloir jeter un oeil à ceci qui a un extrait de code élaboré. Nouvel article de blog: comment obtenir les dimensions de largeur et de hauteur d'un customView (étend la vue) dans Android http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.html
la source
Vous pouvez obtenir à la fois la position et la dimension de la vue à l'écran
la source
fonctionne parfaitement pour moi:
la source