Wie kann ich die beseitigen, die Verzögerung, bevor eine LayoutTransition animation
Ich versuche die neue LayoutTransition
Klasse in der Wabe. Ich habe eine animation, rutschen, ein View
in Ort, wenn Sie es einem ViewGroup
. Ich bemerkte, dass es eine leichte Verzögerung (um die 20ms) zwischen, wenn eine Ansicht zum ersten mal dargestellt wird und wenn die LayoutTransition.APPEARING
animation beginnt. In anderen Worten, nach der Ansicht auf dem Bildschirm angezeigt wird, hängt er in der Luft für einen moment, und dann beginnt, Sie zu animieren, in den Ort. Sie können feststellen, diese auch in die ApiDemos
Beispielprojekt. In der layout-animation Beispiele, es gibt immer eine Verzögerung, bevor eine ViewGroup
's ERSCHEINEN animation startet. Ich habe sogar versucht die Einstellung der anderen LayoutTransition
Animationen auf null, oder schließlich geben Sie sehr kurze Dauer, aber immer noch die APPEARING
animation verzögert. Hier ist mein 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));
}
});
}
}
Hier ist der layout-Datei, die einhergeht mit dem Beispiel:
<?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>
Wie kann ich die beseitigen, die Verzögerung, bevor der APPEARING
animation?
InformationsquelleAutor Tony Wong | 2011-03-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Recht - es gibt eine Verzögerung auf beiden Ebenen. Wenn Sie ein Animator im Rahmen einer LayoutTransition, werden Sie wollen, stellen Sie die Dauer und startDelay auf die LayoutTransition Objekt, nicht auf die zugrunde liegenden Animator (weil die übergangs-Objekt liefert seine eigenen Werte für diese Eigenschaften, die Animatoren, dass es läuft).
Der Grund dafür ist, dass ein LayoutTransition ist in der Regel gehen, um eine Sequenz von Animationen, die auf die Objekte in einem container. So, zum Beispiel, wenn Sie wollen, ein Objekt zu 'erscheinen' im container, dann der übergang wird zuerst animieren Sie die anderen Objekte aus dem Weg, dann animieren Sie das neue Objekt in Platz. Vorstellen hinzufügen eines Elements in der Mitte einer Gruppe von Objekten (wie in dem Fall sehen Sie in der ApiDemos apps); es macht erst Platz, dann verblasst das Objekt in.
Im Falle der original-code von oben, Sie wollen, dass die erscheinende animation sofort ausgeführt werden, so sollte man den übergang startDelay für das ERSCHEINEN auf 0 (wie in der Antwort oben).
Gehen den anderen Weg, VERSCHWINDEN Animationen standardmäßig keine startDelay, aber CHANGE_DISAPPEARING Animationen haben ein startDelay gleich der Dauer der animation VERSCHWINDEN, unter der Annahme, dass Sie zuerst wollen, um ein Element zu entfernen, dann animieren Sie die anderen Elemente in dem container, in Ihren neuen stellen.
Da diese Annahmen, die nicht unbedingt für jede situation gibt es Dauer/startDelay Eigenschaften auf LayoutTransition zur Kontrolle der Verhaltensweisen, je nachdem wie Sie es brauchen, um die Arbeit in Ihrer konkreten Fällen.
Beachten Sie auch, dass, wenn Sie nicht möchten, führen Sie einen der Animations-Typen, sollten Sie festlegen, dass die animation auf null (siehe die Dokumentation für LayoutTransition.setAnimator(int, Animator)). Setzen Sie es auf Ihre dummyAnimator wird nicht die gleiche Wirkung haben. Für eine Sache, die die Standard-Dauer/startDelay Werte auf der LayoutTransition wird immer noch gelten, auch wenn Sie benutzerdefinierte Animatoren für diese Animationen.
Etwas anderes zu beachten: die zugrunde liegende timing-Mechanismus (für Android, sondern auch für die meisten anderen Plattformen, die ich gearbeitet habe) ist die minimale Auflösung. So, Sie legen eine Dauer von '1',, das kann nicht dazu führen, dass die animation endet in 1ms. Stattdessen wird es laufen für einen frame, dann auf der nächsten (in der Regel die refresh-rate des Geräts in eine gut konzipierte Anwendung, wenn das system nicht verzetteln) Sie werden sehen, dass die animation enden soll.
Gute Idee - ich werde das hinzufügen einige der LayoutTransition javadocs zu sprechen über das standardmäßige Verhalten/Verzögerungen.
.....Chet berührte nur meine digitals.....
InformationsquelleAutor Chet Haase
Es stellt sich heraus, beide
Animator
undLayoutTransition
jeder hat ein start-delay-Wert. DieAnimator
start-Verzögerung ist bereits null, so ändern, dass hat auch nicht geholfen. Was ist komisch ist, dass die start-Verzögerung fürLayoutTransition
scheint größer als null sein, zumindest für den Fall derLayoutTransition.APPEARING
. Hier ist der funktionierende code:InformationsquelleAutor Tony Wong