Comment puis-je éliminer le délai avant une animation LayoutTransition
Je suis à essayer les nouvelles LayoutTransition
classe en Nid d'abeilles. J'ai mis une animation qui glisse un View
en place lors de l'ajout à un ViewGroup
. J'ai remarqué qu'il y a un léger retard (environ 20ms) entre le moment où une vue de premier rendu et lorsque le LayoutTransition.APPEARING
début de l'animation. En d'autres termes, après le point de vue s'affiche sur l'écran, il est suspendu dans l'air pendant un moment, puis commence à s'animer en place. Vous pouvez remarquer ce même dans le ApiDemos
exemple de projet. Dans la mise en page de l'animation des exemples, il y a toujours un délai avant qu'un ViewGroup
'APPARAISSANT animation commence. J'ai même essayé de paramétrer les autres LayoutTransition
animations à null, ou enfin leur donnant de très courtes durées, mais encore la APPEARING
animation est retardée. Voici mon code:
public class DebugExampleFour extends Activity {
private int numButtons = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.debug_example_four);
final ViewGroup frame = (ViewGroup) findViewById(R.id.frame_container);
LayoutTransition transitioner = new LayoutTransition();
Animator appearingAnimation = ObjectAnimator.ofFloat(null, "translationX", 600, 0);
appearingAnimation.setDuration(45);
appearingAnimation.setStartDelay(0);
appearingAnimation.setInterpolator(new DecelerateInterpolator());
appearingAnimation.addListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator anim) {
View view = (View) ((ObjectAnimator) anim).getTarget();
view.setTranslationX(0f);
}
});
transitioner.setAnimator(LayoutTransition.APPEARING, appearingAnimation);
Animator dummyAnimation = ObjectAnimator.ofInt(0, 1);
dummyAnimation.setDuration(1);
dummyAnimation.setStartDelay(0);
transitioner.setAnimator(LayoutTransition.CHANGE_APPEARING, dummyAnimation);
transitioner.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, dummyAnimation);
transitioner.setAnimator(LayoutTransition.DISAPPEARING, dummyAnimation);
frame.setLayoutTransition(transitioner);
Button addButton = (Button) findViewById(R.id.addNewButton);
addButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Button newButton = new Button(DebugExampleFour.this);
newButton.setText("Click To Remove " + (numButtons++));
newButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
frame.removeView(v);
}
});
frame.addView(newButton, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
});
}
}
Voici le fichier de mise en page qui va de pair avec l'exemple:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="vertical">
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Add Button"
android:id="@+id/addNewButton" />
<LinearLayout android:orientation="vertical"
android:layout_width="match_parent" android:layout_height="match_parent"
android:id="@+id/frame_container" android:animateLayoutChanges="true" />
</LinearLayout>
Comment puis-je éliminer le délai avant que l' APPEARING
animation?
source d'informationauteur Tony Wong
Droit - il y a un délai à deux niveaux. Quand vous exécutez un Animateur dans le cadre d'un LayoutTransition, vous souhaitez définir la durée et startDelay sur le LayoutTransition objet, pas sur le sous-jacent Animateur (parce que la transition de l'objet la fourniture de ses propres valeurs de ces propriétés pour les animateurs qu'il fonctionne).
La raison pour cela est qu'une LayoutTransition est généralement va être une séquence d'animations qui s'exécutent sur les objets à l'intérieur d'un conteneur. Ainsi, par exemple, si vous souhaitez qu'un objet "apparaissent" dans un récipient, puis la transition sera d'abord animer les autres objets hors de la voie, puis d'animer le nouvel objet en place. Imaginer l'ajout d'un élément au milieu d'un ensemble d'objets (comme dans le cas que vous voyez dans le ApiDemos apps); il fait d'abord l'espace, puis disparaît de l'objet.
Dans le cas de l'original du code ci-dessus, vous voulez l'apparition d'animation pour exécuter immédiatement, de sorte que vous devez définir la transition startDelay APPARAISSANT à 0 (comme vous l'avez fait dans la réponse ci-dessus).
Va dans l'autre sens, la DISPARITION des animations par défaut ont pas startDelay, mais CHANGE_DISAPPEARING animations ont un startDelay égale à la durée de la DISPARITION de l'animation, sous l'hypothèse que vous devez d'abord supprimer un élément, puis d'animer les autres éléments dans le conteneur dans leurs nouveaux lieux.
Puisque ce sont des hypothèses qui ne s'applique pas nécessairement à toutes les situations, il y a de la durée/startDelay propriétés sur LayoutTransition pour contrôler les comportements selon la façon dont vous en avez besoin pour travailler dans votre cas précis.
Notez également que si vous ne voulez pas exécuter l'un des types d'animation, vous devez définir cette animation à null (voir la documentation pour LayoutTransition.setAnimator(int, Animateur)). Réglage à votre dummyAnimator n'aura pas le même effet. Pour une chose, la durée par défaut/startDelay valeurs sur le LayoutTransition continueront de s'appliquer, même si vous fournissez personnalisé des Animateurs pour ces animations.
Autre chose d'être conscient de: le mécanisme de synchronisation (pour Android, mais aussi pour la plupart des autres plates-formes que j'ai jamais travaillé) va avoir une certaine résolution minimale. Si vous vous définissez une durée d '1', qui ne peut entraîner que l'animation se terminant en 1ms. Au lieu de cela, il sera exécuté une image, puis sur l'image suivante (généralement le taux de rafraîchissement de l'appareil dans un bon comportement de la demande si le système n'est pas embourbé), il va voir que l'animation doit se terminer.
Il s'avère à la fois
Animator
etLayoutTransition
chacune dispose d'un délai de démarrage de la valeur. LeAnimator
délai de démarrage est déjà à zéro, de sorte qu'un changement qui n'a pas aidé. Ce qui est bizarre, c'est que le délai de démarrage pourLayoutTransition
semble être supérieure à zéro, au moins pour le cas deLayoutTransition.APPEARING
. Voici le code de travail: