0

我目前正在尝试使用 TranslateAnimation 为按钮的位置设置动画。我在多个地方读到,使实际按钮和可绘制对象移动的方法是在动画之后更改其布局。我已经这样做了,但是遇到了两个问题/解决方案:

  1. 要么我添加 setFillAfter(true)。这很好,因为drawable在动画之后仍然存在,但是当布局改变时,drawable从它应该在的位置偏移了平移距离,而按钮的空白框架现在是它应该在的位置。

  2. 添加 setFillAfter(false)。这样做,然后在动画正常工作后设置布局,但图标会闪烁,我认为这是动画结束和使用新布局参数刷新屏幕之间的延迟。我目前正在使用此代码,但是 flash 是不可接受的,所以我想找到一个解决方案来修复它。

这是我目前的代码:

final View aniView = v;  // v is some view
TranslateAnimation ani = new TranslateAnimation(0, 
240 - v.getLeft() - v.getWidth() / 2, 
0, 
240 - v.getTop() - v.getHeight() / 2 );


ani.setDuration( 500 );

ani.setFillAfter( false );
ani.setAnimationListener( new AnimationListener() {
public void onAnimationEnd( Animation a ) {
        aniView.setTag( new Boolean( true ) );
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( aniView.getWidth(), 
    aniView.getHeight() );
    params.leftMargin = 240 - aniView.getWidth() / 2;
    params.topMargin = 240 - aniView.getHeight() / 2;

    aniView.setLayoutParams(params);
}
public void onAnimationStart( Animation a ) {}
public void onAnimationRepeat( Animation a ) {}
});
v.animationStart( ani );
4

2 回答 2

3

我已经找到了自己问题的解决方案,并将为遇到相同问题的任何人发布代码。基本上这个想法是预先设置布局参数并基本上反转动画。这是想法:

TranslateAnimation ani = new TranslateAnimation(v.getLeft() + v.getWidth() / 2 - 240 , 
                0, 
                v.getTop() + v.getHeight() / 2 - 240, 
                0);


        ani.setDuration( 500 );
        ani.setFillAfter( true );
        ani.setDuration( 1000 );
        ani.setFillAfter( true );
        ani.setAnimationListener( new AnimationListener() {
            public void onAnimationEnd( Animation a ) {
                aniView.setTag( new Boolean( true ) );
            }
            public void onAnimationStart( Animation a ) {}
            public void onAnimationRepeat( Animation a ) {}
        });

        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( v.getWidth(), 
                v.getHeight() );
        params.leftMargin = 240 - aniView.getWidth() / 2;
        params.topMargin = 240 - aniView.getHeight() / 2;

        v.setLayoutParams(params);
        v.startAnimation( set );
于 2012-10-17T02:34:06.277 回答
0

完成 Pete 的精彩回答后,我在尝试为完整的活动布局设置动画时遇到了同样的问题(动画末尾的闪烁),但我使用了 view.translateX 而不是 Layout Params ......而且这个解决方案也适用于我的情况。

于 2015-08-14T14:23:42.157 回答