3

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

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

2 回答 2

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);
于 2012-06-08T11:07:37.257 回答
0

因为 TranslateAnimation 只改变 View 的绘制位置。

尝试这个:

    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 更改为父布局。

于 2012-06-08T10:05:11.857 回答