在Android动画中setfillafter(true)之后视图的实际位置没有改变

时间:2012-06-08 09:57:53

标签: android listview animation

我正在通过此代码移动视图,但视图的实际位置没有改变,为什么

                TranslateAnimation ta = new TranslateAnimation(0, 0, Animation.RELATIVE_TO_SELF, -mbar4.getHeight());
                ta.setDuration(1000);
                ta.setFillAfter(true);
                v4.startAnimation(ta);

2 个答案:

答案 0 :(得分:3)

直到android排除的版本3(API 11),所有动画都没有真正改变视图,只是它的显示方式。不仅如此,我认为他们根本不使用GPU。

为了检查它,你可以使用一个按钮和setOnClickListener,看看无论你使用哪种动画,点击都只能在原来的位置和大小上运作。

这是使用translateAnimation移动视图的示例代码:

final int deltaXToMove=50;
TranslateAnimation translateAnimation=new TranslateAnimation(0,deltaXToMove,0,0);
int animationTime=1000;
translateAnimation.setDuration(animationTime);
translateAnimation.setFillEnabled(true);
translateAnimation.setFillAfter(true);
final Button b=(Button)findViewById(R.id.button);
translateAnimation.setAnimationListener(new AnimationListener()
  {
  @Override
  public void onAnimationEnd(Animation animation)
    {
    animation.setFillAfter(false);
    FrameLayout.LayoutParams par=(LayoutParams)b.getLayoutParams();
    par.leftMargin=deltaXToMove;
    b.setLayoutParams(par);
    }
...
b.startAnimation(translateAnimation);

答案 1 :(得分:0)

因为TranslateAnimation仅更改绘制视图的位置。

试试这个:

    TranslateAnimation ta = new TranslateAnimation(0, 0, Animation.RELATIVE_TO_SELF, -mbar4.getHeight());
    ta.setDuration(1000);
    ta.setFillAfter(true);
    ta.setAnimationListener(new AnimationListener() {

        public void onAnimationStart(Animation animation) {}

        public void onAnimationRepeat(Animation animation) {}

        public void onAnimationEnd(Animation animation) {
            ((RelativeLayout.LayoutParams)v4.getLayoutParams()).bottomMargin = mbar4.getHeight();
            v4.requestLayou();
        }
    });
    v4.startAnimation(ta);

将RelativeLayout.LayoutParams更改为父布局的任何内容。