我目前正在尝试使用TranslateAnimation为按钮的位置设置动画。我已经在多个地方读过,实际按钮的移动方式以及可绘制的方法是在动画后更改其布局。我已经做到了,但我遇到了两个问题/解决方案:
我要么添加setFillAfter(true)。这很好,因为drawable在动画之后仍然存在,但是当布局改变时,drawable从它应该的位置偏移了平移距离,而按钮的空白帧现在应该是它应该的位置。
添加setFillAfter(false)。执行此操作,然后在动画工作之后设置布局,但图标将闪烁,我认为这是动画结束和使用新布局参数刷新屏幕之间的延迟。我目前正在使用此代码,但闪存是不可接受的,所以我想找到解决方案来修复它。
这是我目前的代码:
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 );
答案 0 :(得分: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 );
答案 1 :(得分:0)
从Pete完成了很棒的答案,我在尝试动画完整的活动布局(动画结束时闪烁)时遇到了同样的问题,但我使用了view.translateX而不是Layout Params ...而且这个解决方案是也适用于我的情况。