未知的动画名称:decelerateInterpolator

时间:2015-10-28 09:35:15

标签: android android-animation

Android Studio 1.5
Device Samsung 4.4.2

我正在尝试将从ArrayList加载的项目设置为recyclelerview。我在单击下拉箭头时,项目应在展开时设置动画(减速),并在折叠时设置动画。但是,目前只显示列表项。

调用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);
    }

以下是几个屏幕截图:

处于崩溃状态<​​/ p>

enter image description here

点击箭头后,解释清单 enter image description here

这是我正在使用的布局,它代表将在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);

非常感谢任何建议,

4 个答案:

答案 0 :(得分:7)

您不能使用doThrow(new RuntimeException()).when(mockedClass).methodName(); ,因为它不是动画,而是插补器:

  

插值器定义动画的变化率。这个   允许基本的动画效果(alpha,scale,translate,rotate)   加速,减速,重复等等。

     

参考:
  http://developer.android.com/reference/android/view/animation/Interpolator.html

正如您所看到的,描述它们的XML完全不同:

decelerate_interpolator

Source

decelerate_interpolator.xml
<decelerateInterpolator />

Source

slide_in_left.xml

答案 1 :(得分:7)

如果您想使用减速插补器 ,您需要将其设置为插值器,而不是动画师

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);
}

<强>更新

您说您正在使用com.bignerdranch.android:expandablerecyclerview:2.0.3

从图书馆的官方文档中,它清楚地说明了如何创建展开/折叠动画

  

您还可以通过覆盖创建自己的动画以进行扩展   ParentViewHolder#onExpansionToggled(boolean),将被要求   在展开或折叠itemView时。

我建议你看一下图书馆的official example

答案 2 :(得分:2)

要在列表展开和折叠时为列表设置动画,请考虑使用Android中的ItemAnimator。

您需要设置一个自定义itemAnimator,类似于以下链接中的那个:

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

将方法runPendingAnimations中的itemAnimator设置为减速插值器。

@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设置为回收站视图。

recyclerView.setItemAnimator(new MyItemAnimator());

答案 3 :(得分:2)

您可以使用以下代码执行此操作。

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

希望它会对你有所帮助。