0

在 RecyclerView 的一行内做一些动画(不是行本身。想象一下扩展文本),有时动画会泄漏到其他不应该有动画的回收视图。

由于我使用属性动画,缩放动作调整了内部视图的大小,并且可以在两个方面看到泄漏:1)动画将继续(我可以通过一些守卫来克服)2)视图已调整大小并停止在其轨道上因此它将反映在循环视图中。

如何将视图重置为原始状态?我从帖子中尝试了许多方法,但没有一个解决它。我得到的最接近的定义是在这篇未回答的帖子中: 如何在使用动画师为其某些属性设置动画后将视图重置为原始状态?

这是我如何在 onBind 中设置动画的示例(这个尝试使用 onAnimationEnd ,我在一篇文章中找到但没有用)

ObjectAnimator scaleXUp = ObjectAnimator.ofFloat(mView, View.SCALE_X, 10f);
        scaleXUp.setRepeatCount(ValueAnimator.INFINITE);
        scaleXUp.setRepeatMode(ValueAnimator.REVERSE);
        scaleXUp.setDuration(700);
        ObjectAnimator scaleYUp = ObjectAnimator.ofFloat(mView, View.SCALE_Y, 10f);
        scaleYUp.setRepeatCount(ValueAnimator.INFINITE);
        scaleYUp.setRepeatMode(ValueAnimator.REVERSE);
        scaleYUp.setDuration(700);
        mTotalAnimation = new AnimatorSet();
        mTotalAnimation.play(scaleXUp).with(scaleYUp);
        mTotalAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
        mTotalAnimation.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                animation.removeListener(this);
                animation.setDuration(0);
                for(Animator va : ((AnimatorSet)animation).getChildAnimations()) {
                    ((ValueAnimator)va).reverse();
                }
            }
        });
        mTotalAnimation.start();

这是我在 onUnbindData 中所做的:

if (mTotalAnimation != null) {
        mTotalAnimation.end();
        mTotalAnimation = null;
    }

正如我看到很多人喜欢 clearAnimation 方法一样 - 尝试过但也没有奏效。

4

1 回答 1

2

4天,没有一个回应,但同时我自己解决了。所以方法很接近,只是放错了位置。

我添加了这个方法:

private void stopAnimation() {
    for (Animator anim : mTotalAnimation.getChildAnimations()) {
        ((ObjectAnimator) anim).reverse();
        anim.end();
    }
}

当我想重置视图时,我会调用它。

在这里,我从 AnimatorSet 获取动画并反转和结束每个动画。我不明白为什么我必须手动执行此操作,但看起来此功能将添加到 Android O 中: https ://developer.android.com/preview/api-overview.html#aset

从 Android O 开始,AnimatorSet API 现在支持反向搜索和播放。Seeking 允许您将动画集的位置设置为特定的时间点。如果您的应用包含可撤消操作的动画,则反向播放很有用。您可以反向播放相同的动画集,而不是定义两个单独的动画集。

于 2017-08-15T19:58:33.970 回答