您如何为视图填充的变化设置动画?

Posted

技术标签:

【中文标题】您如何为视图填充的变化设置动画?【英文标题】:How do you animate a change in a view's padding? 【发布时间】:2013-08-24 15:00:11 【问题描述】:

我想对视图填充的变化进行动画处理。翻译动画的放置位置与我要应用的填充相同。

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

【问题讨论】:

【参考方案1】:

使用ValueAnimator,它非常简单整洁

说, 我们必须将右侧填充更改为 _20dp,其中左侧、顶部和底部填充分别为 _6dp、_6dp 和 0。

ofInt() 是可变参数类型。我们必须设置动画的值是作为 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();

【讨论】:

【参考方案2】:

与其立即设置填充,不如尝试在动画完成后使用动画侦听器设置填充?

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

【讨论】:

我之前尝试过这个实现,但结果仍然是类似的图形故障。但是,我找到了解决它的方法。在设置填充之前,我在动画视图上调用了.clearAnimation()。我假设.onAnimationEnd() 中的代码在动画结束后运行。好像不是这样的。 另外我删除了.setFillAfter()【参考方案3】:

以下是如何在 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()

【讨论】:

以上是关于您如何为视图填充的变化设置动画?的主要内容,如果未能解决你的问题,请参考以下文章

如何为自定义视图选择设置膨胀和颜色变化的动画?

如何为 CAShapeLayer 路径和填充颜色设置动画

iOS:如何为uibezierpath中的填充设置动画?

如何为 CALayer 的角半径设置动画

您如何为 jgit 设置 jschconfigsessionfactory 的配置以便拉取和推送工作?

如何为 SVG 多边形设置动画以进行填充?