如何为视图填充中的更改设置动画?

时间:2013-08-22 02:58:51

标签: android animation view viewgroup

我想在视图的填充中设置动画的动画。翻译动画的静止位置与我想要应用的填充相同。

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 个答案:

答案 0 :(得分:43)

使用ValueAnimator,它非常简单且整洁

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

ofInt()是varagrs类型。我们对动画的值是作为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();

答案 1 :(得分:3)

为什么不动画监听器在动画完成后设置填充,而不是立即设置填充?

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

答案 2 :(得分:0)

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