如何为视图的填充动画变化添加动画效果?

13

我想要动画地改变一个视图的填充(padding)。平移动画的静止位置应该与我想要应用的填充相同。

TranslateAnimation moveleft = new TranslateAnimation(Animation.ABSOLUTE, 0.0f,
                    Animation.ABSOLUTE, PADDING, Animation.ABSOLUTE,
                    0.0f, Animation.ABSOLUTE, 0.0f);

moveLeft.setDuration(500);
moveLeft.setFillAfter(true);

这将启动视图动画,然后设置填充。但这不完全有效,因为它会导致图形故障。

v.startAnimation(moveleft);   
v.setPadding(PADDING, 0, 0,0);
3个回答

57

使用ValueAnimator非常简单和清晰。

例如,我们需要将右侧填充更改为_20dp,而左侧、顶部和底部填充分别为_6dp、_6dp和0。

ofInt()是varargs类型。我们要动画化的值作为KeyValue对传递给它(arg1=当前值,arg2=目标值,............)

让我们开始吧。

ValueAnimator animator = ValueAnimator.ofInt(view.getPaddingRight(), _20dp);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator){
        view.setPadding(_6dp, _6dp, (Integer) valueAnimator.getAnimatedValue(), 0);
    }
});
animator.setDuration(200);
animator.start();

3

不要立即设置你的填充,为什么不尝试使用动画监听器在动画完成后设置填充?

v.setAnimationListener(new Animation.AnimationListener() {
    ...
    @Override
    public void onAnimationEnd(){
        v.setPadding(PADDING, 0, 0,0);
    }
    ...
});
v.startAnimation(moveleft);

我之前尝试过这个实现,但仍然出现了类似的图形故障。不过,我找到了解决方法。在设置填充之前,我在动画视图上调用了.clearAnimation()。我假设.onAnimationEnd()中的代码在动画结束后运行。但事实并非如此。 - Tevin J
另外,我删除了.setFillAfter() - Tevin J

2
这是如何在Kotlin中使用setPadding进行动画效果的代码:

private fun setPaddingWithAnimation() {

    val paddingDp: Int = 20

    val density: Float = requireActivity().getResources().getDisplayMetrics().density

    val paddingPixel: Int = (paddingDp * density).toInt()

    val animator = ValueAnimator.ofInt(recyclerItems.paddingRight, paddingPixel)

    animator.addUpdateListener { valueAnimator -> binding.recyclerHealthTips.recyclerHealthTips.setPadding(
                paddingPixel, 0, valueAnimator.animatedValue as Int, 0) }
        
    animator.duration = 500
    animator.start()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接