9
votes

TransitionDrawable: transition automatiquement une fois qu'elle est terminée

Je veux highliht des éléments de liste réellement ajoutés avec un effet intéressant. Je pensais que c'était simple et facile, mais je suis tombé sur un problème:

Je veux jouer à une animation transiondrable et une fois qu'elle complète - le rembobiner. Le nouvel article va être dirigé un instant, puis il va se fondre avec le reste.

transitionné a des méthodes d'animation en avant et en arrière, mais aucune ne pouvant être utilisée pour la synchronisation. Je m'attendais à une possibilité de spécifier un rappel pour l'achèvement de l'animation, quelque chose comme: xxx

mais rien de tel est supporté par une classe transitionnement.

Le problème est : Comment jouer à l'animation transitionné, et quand il se termine - jouez immédiatement en arrière? J'ai eu une idée d'utiliser la classe de la classe pour retarder l'exécution de la partie arrière de l'animation, mais cette solution semble un peu trop lourde pour une chose aussi simple.

ou peut-être que je devrait utiliser quelque chose de différent de cette transitionDrable? J'aimerais éviter d'utiliser des animations de propriété, car je souhaite supporter des appareils plus anciens (et que les PA sont avaïnes depuis l'abeille).


0 commentaires

5 Réponses :


-2
votes

Évaluez à l'aide de Viewanimator à la place http://developer.android.com/reference/andrroid/widget/viewanimator.html

L'objet Animation in et Out attaché à la vue Viewanimator a une animationListener qui déclenche l'événement que vous souhaitez capturer


2 commentaires

Je me trompe peut-être - mais ce n'est-il pas que VisuLanimator utilisait des vues (comme dans ViewFlipper, qui est la sous-classe)?


Oui et ma suggestion serait d'avoir deux points de vue; une normale et une surlignée. Fondamentalement, pour votre liste de lignes XML, vous avez la vue Viewanimator en tant qu'élément extérieur et ses enfants sont les mêmes que votre ligne de liste actuelle. Ensuite, lorsqu'un élément est ajouté que vous souhaitez avoir la mise au point, vous avez une nouvelle vue sur la vue Viewanimator et démarrez la transition à la vue qui représente votre état en surbrillance. Vous configurez un auditeur d'événement et capturez l'événement lorsqu'il est terminé et vous inversez l'action.



5
votes

Je ne l'ai pas encore essayé moi-même, mais je dirais que ce que vous vise peut aussi être possible avec une animation de vision à l'ancienne, un Tween sera précis. Au lieu de manipuler directement le fond introductible (en supposant que vous faites ce que vous faites actuellement), vous pouvez potentiellement créer le même effet en modifiant la propriété alpha d'une vue qui a exactement les mêmes dimensions que la disposition de la rangée. Vous pouvez ensuite spécifier à la fois l'animation «normale» et son inverse dans une seule animationset et que ce dernier commence par un délai en fonction du premier. Alternativement, l'animation fournit un AnimationListener Vous pouvez vous connecter à et être averti lorsque la première animation se termine et commence par la suite son inverse.

En regardant le code source de transitionDrawable, je vois également certaines possibilités d'étendre la mise en œuvre actuelle avec une interface d'auditeur personnalisée. Il ne devrait pas être trop difficile de réaliser réellement le motif que vous illustrer dans le code de code dans votre question.

Je suis un peu court à l'heure actuelle, alors tirez-moi un commentaire au cas où vous auriez besoin de plus de points de pointe concrets (par exemple, des extraits de code) - Je vais alors essayer de trouver quelque temps ce week-end pour vous aider. < / p>


1 commentaires

Hmm ... L'utilisation d'une touche Tween pourrait fonctionner si je définirais une couleur d'arrière-plan de toute une liste d'envoi à la couleur utilisée aux articles sur la lumière de la LIGHT, et définissez la couleur de toutes les lignes sur blanc. Ensuite, en manipulant une valeur alpha d'une rangée spécifique, j'atteindrais l'effet HighLiHT. Mais l'idée de sous-classement transitionnement semble meilleure, plus propre et plus «à droite». J'ai regardé sa source maintenant et il semble assez facile de mettre en œuvre ce dont j'ai besoin. Je vais mettre à jour ma question avec une solution lorsque je vais le coder, je dois maintenant revenir à ma thèse de maîtrise (non liée à cette question de l'OFC - c'est un projet de passe-temps). Vous gagnez la prime.



0
votes

Peut-être que vous pourriez essayer ceci:

Drawable[] transBack =  new Drawable[] { res.getDrawable( R.drawable.ic_acept_blue ), res.getDrawable( R.drawable.ic_acept )};

ImageView btn = (ImageView) findViewById(R.id.resource);
TransitionDrawable transitionAcept = new TransitionDrawable(transBack);
btn.setImageDrawable(transitionAcept);

btn.setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
      // TODO Auto-generated method stub
      switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:{
           TransitionDrawable transition = (TransitionDrawable) btn.getDrawable();
           transition.startTransition(75);
      }break;
      case MotionEvent.ACTION_UP:{
           TransitionDrawable transition = (TransitionDrawable) btnAcept.getDrawable();
           transition.reverseTransition(75);
           v.performClick();
      }break;
      default:
       break;
   }
   return true;
}
});
btn.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
      //... DO Something here
   }
});


0 commentaires

0
votes

J'ai étendu la mise en œuvre de la transitionDrawable (en fait la copie et modifiée) pour accepter un paramètre RepeatCount qui indique combien de fois pour faire la transition et le dos. Voir le répétableTransItionnementDrawable dans le référentiel ci-dessous.

Je prévois également d'ajouter plus de deux tiroirs de tirage.

https://github.com/mehmet6parmak/customDrawables


0 commentaires

0
votes

Essayez avec un gestionnaire;)

final TransitionDrawable transition = (TransitionDrawable) sizesSelectionLayout.getBackground();
int duration = 500;
transition.startTransition(duration);
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        transition.reverseTransition(duration);
    }
}, duration);


0 commentaires