翻译按钮并使其保持不变

时间:2012-10-17 01:21:56

标签: android android-animation android-button

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

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

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

  3. 这是我目前的代码:

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

2 个答案:

答案 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 ...而且这个解决方案是也适用于我的情况。