Неизвестное имя анимации: decelerateInterpolator

Android Studio 1.5
Device Samsung 4.4.2

Я пытаюсь анимировать элементы, загруженные из ArrayList, в recyclerview. I, когда щелкнет стрелка вниз, элементы должны оживить (замедлить) при расширении и оживить при свертывании. Однако в настоящее время элементы списка просто появляются.

Код, вызывающий setAnimation

 @Override
    public void onBindChildViewHolder(ChatChildViewHolder childViewHolder, int position, Object childListItem) {
        ChatChildTitles chatChildTitles = (ChatChildTitles)childListItem;
        childViewHolder.tvChildTitle.setText(chatChildTitles.getTitle());

        setAnimation(childViewHolder.cvChildRooms, position);
    }

Код для настройки анимации

  private void setAnimation(CardView viewToAnimate, int position) {
        Animation animation = AnimationUtils.loadAnimation(mContext, android.R.anim.fade_in);
        animation.setInterpolator(mContext, android.R.anim.decelerate_interpolator);
        viewToAnimate.startAnimation(animation);
    }

Вот несколько скриншотов:

В сжатом состоянии

введите описание изображения здесь

После того, как стрелка была нажата, выделите список введите описание изображения здесь

Это мой макет, который я использую, который представляет строки, которые будут отображаться в recyclerView:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    android:id="@+id/cvChildRooms"
    xmlns:card="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card:cardBackgroundColor="@color/child_header_lighter_grey"
    card:contentPadding="4dp"
    card:cardPreventCornerOverlap="true">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/profile_image"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center_vertical|start"
        android:src="@drawable/photorace"/>

    <TextView
        android:id="@+id/tvChildTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|center"
        android:text="Coffee Latte Room"
        android:fontFamily="sans-serif-light"
        android:textSize="16sp"
        android:textColor="@android:color/black"/>
</android.support.v7.widget.CardView>

У меня есть функция, которая должна запускать анимацию.

private void setAnimation(CardView viewToAnimate, int position) {
    Animation animation = AnimationUtils.loadAnimation(mContext, android.R.anim.decelerate_interpolator);
    viewToAnimate.startAnimation(animation);
}

Я тестировал, используя следующее, которое работает с slide_in_left. Однако я не хочу, чтобы они скользнули слева.

Animation animation = AnimationUtils.loadAnimation(mContext, android.R.anim.slide_in_left);
viewToAnimate.startAnimation(animation);

Большое спасибо за любые предложения,

Ответ 1

Если вы хотите использовать интерполятор замедления , вам нужно установить его как интерполятор, а не как аниматор:

private void setAnimation(CardView viewToAnimate, int position) {
    Animation animation = AnimationUtils.loadAnimation(mContext, android.R.anim.fade_in); //change this with your desidered (or custom) animation
    animation.setInterpolator(mContext, android.R.anim.decelerate_interpolator);
    viewToAnimate.startAnimation(animation);
}

UPDATE

Вы сказали, что используете com.bignerdranch.android:expandablerecyclerview:2.0.3.

В официальных документах библиотеки четко указано, как создавать анимации расширения/свернуть:

Вы также можете создавать свои собственные анимации для расширения путем переопределения ParentViewHolder#onExpansionToggled(boolean), который будет вызван вы, когда itemView расширяется или сворачивается.

Я предлагаю вам взглянуть на официальный официальный пример в библиотеке.

Ответ 2

Вы не можете использовать decelerate_interpolator, потому что это не анимация, это интерполятор:

Интерполятор определяет скорость изменения анимации. Эта позволяет использовать базовые эффекты анимации (альфа, масштаб, перевод, поворот) ускоряться, замедляться, повторяться и т.д.

Справка:
http://developer.android.com/reference/android/view/animation/Interpolator.html

Как вы можете видеть, XML, описывающий их, совершенно другой:

Источник decelerate_interpolator.xml:

<decelerateInterpolator />

Источник slide_in_left.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-50%p" android:toXDelta="0"
            android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
            android:duration="@android:integer/config_mediumAnimTime" />
</set>

Ответ 3

Чтобы анимировать список, когда они расширяются и сворачиваются, рассмотрите возможность использования ItemAnimator из android.

Вам нужно будет настроить собственный элемент ItemAnimator, что-то похожее на тот, что приведен ниже:

https://gist.github.com/ademar111190/dc988c8d899dae0193f7

Задайте элементAnimator в методе runPendingAnimations для вашего замедляющего интерполятора.

@Override
    public void runPendingAnimations() {
        if (!mViewHolders.isEmpty()) {
            int animationDuration = 300;
            AnimatorSet animator;
            View target;
            for (final RecyclerView.ViewHolder viewHolder : mViewHolders) {
                target = viewHolder.itemView;
                target.setPivotX(target.getMeasuredWidth() / 2);
                target.setPivotY(target.getMeasuredHeight() / 2);

                animator = new AnimatorSet();

                animator.playTogether(
                        ObjectAnimator.ofFloat(target, "translationX", -target.getMeasuredWidth(), 0.0f),
                        ObjectAnimator.ofFloat(target, "alpha", target.getAlpha(), 1.0f)
                );

                animator.setTarget(target);
                animator.setDuration(animationDuration);
                animator.setInterpolator(new DecelerateInterpolator());
                animator.setStartDelay((animationDuration * viewHolder.getPosition()) / 10);
                animator.addListener(new AnimatorListener() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        mViewHolders.remove(viewHolder);
                    }
                });
                animator.start();
            }
        }
    }

Затем вам нужно будет установить элемент ItemAnimator в представление recycler.

recyclerView.setItemAnimator(новый MyItemAnimator());

Ответ 4

Для этого вы можете использовать код ниже.

private void hideViews() {
  recyclerView.animate().translationY(-recyclerView.getHeight()).setInterpolator(new AccelerateInterpolator(2));

  FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mFabButton.getLayoutParams();
  int fabBottomMargin = lp.bottomMargin;
  mFabButton.animate().translationY(mFabButton.getHeight()+fabBottomMargin).setInterpolator(new AccelerateInterpolator(2)).start();
}

private void showViews() {
  recyclerView.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2));
  mFabButton.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start();
}

Вы можете вызвать этот метод onClick вашей кнопки.

Надеюсь, это поможет вам.