Gardez Vue animée au final de l'Animation de la Position
Donc je suis à l'animation d'une vue à l'aide de l'animation:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator" >
<translate
android:duration="1000"
android:fromYDelta="0%"
android:toYDelta="-75%" />
</set>
Il ne visuellement ce que je veux, mais j'ai aussi j'ai envie de geler le résultat de cette animation. Comme j'ai besoin d'une certaine manière à obtenir résultant paramètres de mise en page (ou autre chose?) après l'animation et mis à disposition. Assumer la mise en page Y-coord est le passage de 0 à 100, mais je ne sais pas vraiment ce qui était de départ coords et quels sont résultant coords. J'ai besoin d'obtenir résultant coords et mis à la disposition cuz si ne pas faire de mise en page pour retourner à sa position initiale après l'animation, mais j'ai besoin de le faire rester dans la nouvelle position au lieu de retourner en arrière. J'ai aussi besoin de 2.3.x compatible avec la solution.
Mise à JOUR de 1
J'ai aussi essayé NineOldAndroids:
ObjectAnimator.ofFloat(rootWrapper, "translationY", -rootWrapper.getHeight()*75/100).start();
cette anime la vue et afficher les séjours à l'animation de la position - c'est exactement ce que je veux atteindre.
Cependant, tous les contrôles de séjours à leurs positions pratiquement. Même tu mise en page n'est visible que par 25% de sa partie inférieure et 75% de repos écran est vide si je tape qui vide la zone de l'écran puis sur le bouton s (qui était là b4 animation) onClick déclenchée. La même chose arrive avec xml-animtaions si la valeur
animation.setFillAfter(true);
Comment faire pour résoudre ce problème? Toutes les commandes de a à se déplacer avec de la vue.
Mise à JOUR 2
Le code:
public void showAbout(){
final Animation animShow = AnimationUtils.loadAnimation(this, R.anim.about_in_from_bottom);
animShow.setFillAfter(true);
//ObjectAnimator.ofFloat(rootWrapper, "translationY", -rootWrapper.getHeight()*75/100).start();
animShow.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {
LinearLayout.LayoutParams rootlp = (LinearLayout.LayoutParams) rootWrapper.getLayoutParams();
Log.i(this,"rootlp: h: "+rootlp.topMargin+ " /w: "+rootlp.bottomMargin);
rootlp.topMargin = -rootlp.height*75/100;
rootWrapper.setLayoutParams(rootlp);
}
});
rootWrapper.startAnimation(animShow);
}
J'ai eu le problème - rootlp.height
renvoie 0 car son comme MATCH_PARENT ou comme. Il l'habitude de retourner le RÉEL de pixels, mais une valeur qui représente une constante! Donc, il semble que j'ai 2 jouer avec .getViewTreeObserver().addOnGlobalLayoutListener
.
Ok, j'ai eu la réelle hauteur de rootWrapper via getViewTreeObserver(). Et maintenant, à l'aide de la formule rootlp.topMargin = -rootlp.height*75/100;
je reçois encore plus de questions.
1) Après l'animation de Vue se déplace de haut en plus (en raison de réglage LP).
2) les Contrôles qui ont animé la Vue contient les boutons qui doit se déplacer avec la Vue parent) reste à leurs positions presque (ils sont invisibles mais cliquable)! Visuellement ces contrôles sont déplacés avec la Vue animée, et je ne peux pas l'atteindre (il sort de l'écran). Mais si je tape la zone où ils étaient avant l'animation correspondante onClick() déclenche! Quel plaisir!
Mise à JOUR 3
Enfin, j'avais atteint mon objectif! Le problème était avec le déplacement de la Vue de l'enfant conteneurs. Je pensais que si je me déplace pour certains alors tous ses vues enfant sont également en mouvement. Mais ce n'est pas le cas, et je était avait pour déplacer les vues enfant manuellement après l'animation complète de fixer fantôme boutons.
- Pourquoi essayez-vous d'obtenir l'LayoutParams après l'animation? Voulez-vous le point de Vue de séjour à l'animation de la position?
- ouais, Exactement ce que je veux 2do.
- Eh bien voir mon anser et l'utilisation setFillAfter();
Vous devez vous connecter pour publier un commentaire.
Veuillez considérer setFillAfter(boolean); paramètre à true va rendre la vue à rester à l'animation de la position.
Cela peut être fait même plus facile en utilisant la ViewPropertyAnimator, disponible à partir de l'API 14 et suivantes:
Ou d'envisager un AnimationListener pour obtenir le LayoutParams exactement après l'animation:
Mise à JOUR:
Le pourcentage de la valeur dans votre .xml animation est par rapport à la Vue animée de l'dimensions (telles que la largeur et la hauteur). Par conséquent, vous avez juste besoin d'utiliser votre point de Vue sur la largeur et la hauteur des propriétés (selon les conditions météorologiques u utiliser x ou y de l'animation pour obtenir de l'animation de la distance en pixels).
Par exemple:
Votre point de Vue, a une largeur de 400 pixels. Votre animation anime le x-propriété de 0% à 75%, ce qui signifie que votre point de vue va se déplacer de 300 pixels (400 * 0.75) sur le côté droit. Donc onAnimationEnd(), définissez la LayoutParams.leftMargin à 300 et votre point de Vue sera la position souhaitée.
Je trouve que le simple réglage de fillEnabled et fillAfter à VRAI ne résout pas le problème quand des choses comme la souris/toucher les auditeurs sont impliqués. Réglage de remplissage activé et remplir après pour être vrai s'assure juste que les pixels de l'affichage sont TIRÉS dans la bonne position finale. Cependant, supposons que la vue en cours d'animation a un onclick auditeur associé. En cliquant sur la vue dans son nouveau visible, ne fait rien, cependant cliquant sur l'écran dans la position de la vue a été à l'origine de déclencher le onClick.
L'exemple suivant est un exemple de la façon de contourner ce problème:
Supposons que nous avons une vue avec un onClickListener jeu de. Supposons aussi que les points de vue les limites sont 0, 0, 0, 0 (gauche, haut, droite, bas).
Supposons maintenant nous voulons déplacer la vue vers la droite par 200. Le code suivant va montrer comment faire cela de manière à déplacer les pixels sur l'établi et la vision sous-jacente de l'objet à la position correcte, d'où le réglage de la onClick être appelée à partir de la position correcte.
lp
objet n'est pas utilisé n'importe oùVous pouvez utiliser NineOldAndroid proxy de la bibliothèque pour l'utilisation de ObjectAnimator comme vous le souhaitez. il prend en charge inférieur api niveaux et utilise la bibliothèque native pour les nouvelles api niveaux.
Simplement importer en tant que LibraryProject et ça sera tout bon.