2013-08-22 42 views
9

我想动画视图的填充中的更改。翻译动画的休息处与我想要应用的填充相同。如何在视图的填充中设置动画变化?

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

而不是设置您的填充向右走,为什么不尝试动画监听器设置动画后填充已经完成?

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

我以前试过这个实现,但它仍然导致类似的图形故障。但是,我找到了解决这个问题的方法。在设置填充之前,我在动画视图上调用了'.clearAnimation()'。我假设'.onAnimationEnd()'中的代码在动画结束后运行。这似乎并非如此。 –

+0

另外我删除了'.setFillAfter()'。 –

34

使用ValueAnimator,其很简单和unclutter

说, 我们要改变右填充到_20dp其中左,顶部和底部填充是_6dp,_6dp和0分别。

ofInt()是varagrs类型。我们有动画的值是在其通作为密钥值对(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

非常好的解决方案+1 –