2016-02-03 7 views
11

Ich habe eine RecyclerView in der Benutzer ein Element auswählt. Nach der Auswahl wird eine bestimmte Ansicht vor dem Text sichtbar (siehe Bild). Ich möchte sein Aussehen animieren.Wie können Animationen geändert werden, die vom animateLayoutChanges-Mechanismus verwendet werden?

Graphical representation

animateLayoutChanges Eigenschaft auf dem Layout des Artikels macht den Job perfekt, mit Ausnahme des Animationstyp für Ansicht Aussehen - es blendet ich möchte es von 0 bis 100% Größe skalieren, ich glaube, es heißt '. Popup-Animation.

Wenn ich animateLayoutChanges deaktivieren und XML-Animation dafür verwenden, funktioniert es, aber der nahegelegene Text ist nicht mehr animiert (er sollte verschoben werden, um Platz für die Ansicht und seinen Rand aufzunehmen). Es wird sofort nach rechts verschoben und dann wird eine Animation abgespielt. Dies ist bei umgekehrter Animation schlimmer, da der Text die Ansicht überlappt, bevor sie verschwunden ist.

Also muss ich irgendwie Standardmechanismus und meine eigene Animation kombinieren. Was wäre der einfachste Weg, dies zu erreichen, ohne sich in benutzerdefinierte Animationen zu vertiefen?

Antwort

21

Nach viel Graben an den falschen Stellen, fand die Antwort selbst. Könnte jemandem helfen.

animateLayoutChanges Eigenschaft, wenn aktiviert, verwendet eine Instanz von LayoutTransition, um ihre Arbeit in ViewGroup zu erledigen.

Also, um Animationen zu ändern, können Sie eine Instanz von LayoutTransition erstellen, setzen Animator für den Übergang, die Sie ändern müssen und dann diese Instanz zu ViewGroup über setLayoutTransition() zuweisen.

In meinem Fall ist das Ergebnis:

Animator scaleDown = ObjectAnimator.ofPropertyValuesHolder((Object)null, PropertyValuesHolder.ofFloat("scaleX", 1, 0), PropertyValuesHolder.ofFloat("scaleY", 1, 0)); 
scaleDown.setDuration(300); 
scaleDown.setInterpolator(new OvershootInterpolator()); 

Animator scaleUp = ObjectAnimator.ofPropertyValuesHolder((Object)null, PropertyValuesHolder.ofFloat("scaleX", 0, 1), PropertyValuesHolder.ofFloat("scaleY", 0, 1)); 
scaleUp.setDuration(300); 
scaleUp.setStartDelay(300); 
scaleUp.setInterpolator(new OvershootInterpolator()); 

LayoutTransition itemLayoutTransition = new LayoutTransition(); 
itemLayoutTransition.setAnimator(LayoutTransition.APPEARING, scaleUp); 
itemLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, scaleDown); 

ViewGroup av = (ViewGroup)v.findViewById(R.id.animated_layout); 
av.setLayoutTransition(itemLayoutTransition); 

Mehr Infos in LayoutTransition reference documentation.

+0

Können Sie bitte den vollständigen Code dafür anzeigen? Scheint nicht für mich zu arbeiten. –

+0

Es ist wirklich eine Weile her, seit ich für Android zuletzt codiert habe, aber immer noch geschafft, es aus meinen Archiven zu graben :) Wenn Sie mit RecyclerView (aus android.support.v7-Bibliothek) vertraut sind, sollte Ihnen diese Liste helfen: https: //gist.github.com/mrnateriver/cd988f6ca745ebad7db7cc16581069ee es ist keine vollständige Implementierung von RecyclerView.Adapter, aber es sollte Ihnen eine Idee geben, wie benutzerdefinierte Animationen funktionieren – mrnateriver

+0

Ich habe auf eine Lösung eines normalen Layouts gehofft (LinearLayout, zum Beispiel) –

Verwandte Themen