尝试重置 属性 Animator 的值以在回收站视图中使用

Trying to reset values from Property Animator to be used in recycler view

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

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

如何将视图重置为原始状态?我尝试了 posts 中的许多方法,但 none 解决了它。我得到的最接近的定义是在这个未回答的 post 中: How to reset view to original state after using animators to animates its some properties?

这是我如何在 onBind 中设置动画的示例(这个尝试使用我在一个 post 中找到的 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 天,没有一个回复,但同时我自己解决了。 所以方法很接近,只是位置错误。

我添加了这个方法:

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

Starting in Android O, the AnimatorSet API now supports seeking and playing in reverse. Seeking lets you set the position of the animation set to a specific point in time. Playing in reverse is useful if your app includes animations for actions that can be undone. Instead of defining two separate animation sets, you can play the same one in reverse.