Android TranslateAnimation réinitialise après l'animation
Je suis la création de quelque chose comme un SlideDrawer mais avec plus de personnalisation, fondamentalement, la chose est travail, mais l'animation est de scintillement à la fin.
Pour expliquer plus en détail, j'ai reçu un TranslateAnimation puis après cette animation, il retourne à la position initiale, si j'ai mis setFillAfter ensuite les boutons à l'intérieur de la mise en page des arrêts de travail. Si j'écoute de la onAnimationEnd et de définir d'autres de la mise en page à Afficher.DISPARU de la mise en page fickers. À en juger par c'est que sur la fin de l'animation, l'affichage revient à la position initiale avant de l'Afficher.GONE est appelé.
Tout conseil serait génial. Grâce
Vous devez vous connecter pour publier un commentaire.
Ici est le bug lié à ce problème
Cela dit en substance que l'
onAnimationEnd(...)
méthode ne fonctionne pas vraiment bien quand un AnimationListener est attaché à une AnimationLa solution de contournement est de l'écouter pour l'animation d'événements dans la vue dans laquelle vous avez été l'application de l'animation, Par exemple, si, au départ, vous étiez fixation de l'animation de l'auditeur à l'animation comme ce
et en appliquant à l'animation d'un
ImageView
comme cePour contourner ce problème, vous devez maintenant créer un personnalisé
ImageView
puis remplacer le onAnimationEnd méthode de la classe de la Vue et de fournir toutes les fonctionnalités, il y
C'est la bonne solution de contournement pour ce problème, de fournir la fonctionnalité de la plus-riden Vue ->
onAnimationEnd(...)
méthode par opposition à laonAnimationEnd(...)
méthode de la AnimationListener attaché à l'Animation.Cela fonctionne correctement et il n'y a plus aucun scintillement vers la fin de l'animation. Espérons que cela aide
De l'API 11, vous pouvez utiliser le
ObjectAnimator
, ce qui modifie les propriétés de la vue, c'est à dire dans le cas d'une traduction, la vue reste à la position qu'il atteint après l'animation.Plus ici.
Soham la réponse ci-dessus fonctionne pour moi, mais il est intéressant de souligner (puisqu'il n'était pas immédiatement évident pour moi lors de la première lecture de ce fil) que vous pouvez toujours obtenir à peu près le même comportement que d'une animation à l'auditeur par un paramètre séparé de l'écouteur sur la vue pour être exécuté à la fin de votre point de Vue est
onAnimationStart()
etonAnimationEnd()
.Par exemple, si votre code doit désactiver un bouton pour la durée d'une animation:
Actuellement,
someView
ne sais pas à propos demyButton
, et je tiens à garder de cette façon. Il vous suffit de créer certains d'écoute sur votre affichage personnalisé de la classe qui est appelée de la même manière:Puis de nouveau dans votre code (probablement une Activité):
De cette façon, vous gardez vos composants séparés proprement, tout en obtenant un AnimationListener qui fonctionne.
À l'aide de Soham réponse, voici un ImageView spécifiques pour les animations de fondu:
Et voici mon code d'animation:
Se débarrasser de
setFillAfter
et il suffit d'utiliserView.GONE
dansonAnimationEnd()
. Voir ici pour un échantillon de Vue personnalisée qui met en œuvre un panneau coulissant à l'aide d'unTranslateAnimation
.View.GONE
); vous pouvez basculer en arrière pour être visible à tout moment.Donc, je cherchais la réponse à cette pour mon Xamarin projet, mais je suppose que cela devrait s'appliquer également à Java. La réalisation que j'ai eu était que le LinearLayout animés TOUJOURS eu la même position (dire, c'est à x=100, y==100) et vos animations devrait être par rapport à cette position.
Le ObjectAnimator était certainement le chemin à parcourir, et voici ma solution:
Tout d'abord, une mise en page simple avec du texte en haut et un LinearLayout en dessous de ce qui est la cible de l'animation....
HTML:
Mon activité, puis, regardé comme suit:
HTML:
Le point le plus important à noter est que les _distanceToTravel (dans ce cas, la traduction sur l'axe des Y) est relative à la propriété Top de la LinearLayout nous animer. Supposons que chacun des LinearLayouts qui détiennent le texte (TOUJOURS SUR l'ÉCRAN, Pour Masquer Une Ligne, Pour Masquer la Ligne Deux), d'une hauteur de 20 (la prise de hauteur totale 60). Le curseur, par exemple, possède une propriété Top de 2100. Parce qu'il est situé en bas, à cacher les deux lignes de moyens nous devons passer le LinearLayout linMySlider par 40 dans le but de cacher les deux lignes, en laissant seulement le premier visible. Si vous pensez que le LinearLayout comme étant TOUJOURS en 2100 il est alors logique que sur la glisser vers le bas nous ajouter 40 à elle (enfin, pas nous, l'Animateur fait ça pour nous), évidente dans le premier OfFloat ligne, où le début la position Y est 0 (c'est à dire 0 par rapport à 2100, donc est égal à 2100) et à sa fin, la position Y est _distanceToTravel (qui est de 40, mais encore par rapport donc égal à égal, en fait, 2140). Dans la direction opposée, nous commençons avec le _distanceToTravel de l'axe (encore 40 ans, mais en fait 2140) et nous terminons à 0 (vous l'aurez deviné 0 loin de 2100 et, par conséquent, 2100).
Espère que tout a un sens: il m'a fallu un peu de temps pour le sou à tomber, mais il fonctionne vraiment bien avec pas de scintillement et aucune réinitialisation de retour à la position initiale (à qui il avait toujours lol). J'espère que la même chose s'applique au code Java comme il le fait dans cet exemple en C#.