Animowanie elementów w widoku recyklera, gdy są one powiązane w adapterze, może nie być najlepszym pomysłem, ponieważ może powodować animację elementów w widoku recyklera przy różnych prędkościach. W moim przypadku element na końcu recyrkulatora ożywi się do swojej pozycji szybciej niż te na górze, ponieważ te na górze muszą się dalej przemieszczać, przez co wyglądają niechlujnie.
Oryginalny kod, którego użyłem do animacji każdego elementu w widoku recyklingu, można znaleźć tutaj:
http://frogermcs.github.io/Instagram-with-Material-Design-concept-is-getting-real/
Ale skopiuję i wkleję kod na wypadek, gdyby link się zepsuł.
KROK 1: Ustaw to w swojej metodzie onCreate, tak aby animacja była uruchamiana tylko raz:
if (savedInstanceState == null) {
pendingIntroAnimation = true;
}
KROK 2: Musisz wprowadzić ten kod do metody, w której chcesz rozpocząć animację:
if (pendingIntroAnimation) {
pendingIntroAnimation = false;
startIntroAnimation();
}
W łączu pisarz animuje ikony paska narzędzi, więc umieścił go w tej metodzie:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
inboxMenuItem = menu.findItem(R.id.action_inbox);
inboxMenuItem.setActionView(R.layout.menu_item_view);
if (pendingIntroAnimation) {
pendingIntroAnimation = false;
startIntroAnimation();
}
return true;
}
KROK 3: Teraz napisz logikę dla startIntroAnimation ():
private static final int ANIM_DURATION_TOOLBAR = 300;
private void startIntroAnimation() {
btnCreate.setTranslationY(2 * getResources().getDimensionPixelOffset(R.dimen.btn_fab_size));
int actionbarSize = Utils.dpToPx(56);
toolbar.setTranslationY(-actionbarSize);
ivLogo.setTranslationY(-actionbarSize);
inboxMenuItem.getActionView().setTranslationY(-actionbarSize);
toolbar.animate()
.translationY(0)
.setDuration(ANIM_DURATION_TOOLBAR)
.setStartDelay(300);
ivLogo.animate()
.translationY(0)
.setDuration(ANIM_DURATION_TOOLBAR)
.setStartDelay(400);
inboxMenuItem.getActionView().animate()
.translationY(0)
.setDuration(ANIM_DURATION_TOOLBAR)
.setStartDelay(500)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
startContentAnimation();
}
})
.start();
}
Moja preferowana alternatywa:
Wolałbym animować cały widok recyclingler zamiast elementów w widoku recyclingler.
KROK 1 i 2 pozostają takie same.
W KROKU 3, gdy tylko wywołanie interfejsu API powróci z danymi, rozpocznę animację.
private void startIntroAnimation() {
recyclerview.setTranslationY(latestPostRecyclerview.getHeight());
recyclerview.setAlpha(0f);
recyclerview.animate()
.translationY(0)
.setDuration(400)
.alpha(1f)
.setInterpolator(new AccelerateDecelerateInterpolator())
.start();
}
Spowoduje to animację całego widoku recyklera, tak aby leciał od dołu ekranu.