Анімаційні елементи в перегляді рециркулятора, коли вони прив’язані до адаптера, можуть бути не найкращою ідеєю, оскільки це може спричинити анімацію елементів у переробці перегляду з різною швидкістю. У моєму випадку, предмет в кінці рециркулятора перетворюється на їхнє положення швидше, ніж ті, що знаходяться вгорі, як ті, хто знаходиться вгорі, далі рухаються, тому він виглядає непристойним.
Оригінальний код, який я використовував для анімації кожного елемента в перегляді рециркулятора, можна знайти тут:
http://frogermcs.github.io/Instagram-with-Material-Design-concept-is-getting-real/
Але я скопіюю і вставте код на випадок, коли посилання розірветься.
КРОК 1: Установіть це всередині вашого методу onCreate, щоб ви гарантували, що анімація запускається лише один раз:
if (savedInstanceState == null) {
pendingIntroAnimation = true;
}
КРОК 2: Вам потрібно буде ввести цей код у метод, де ви хочете запустити анімацію:
if (pendingIntroAnimation) {
pendingIntroAnimation = false;
startIntroAnimation();
}
У посиланні автор пише анімацію піктограм панелі інструментів, тому він помістив її всередині цього методу:
@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;
}
КРОК 3: Тепер запишіть логіку для 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();
}
Моя бажана альтернатива:
Я б швидше оживив весь recilerview замість елементів всередині recilerview.
КРОК 1 і 2 залишаються колишніми.
На КРОКІ 3, як тільки ваш дзвінок API повернеться з вашими даними, я б запустив анімацію.
private void startIntroAnimation() {
recyclerview.setTranslationY(latestPostRecyclerview.getHeight());
recyclerview.setAlpha(0f);
recyclerview.animate()
.translationY(0)
.setDuration(400)
.alpha(1f)
.setInterpolator(new AccelerateDecelerateInterpolator())
.start();
}
Це оживить весь ваш перегляд рециркулятора, щоб він летів у нижній частині екрана.