android中的动画?

时间:2011-09-15 09:59:26

标签: android android-animation

我在游戏项目中使用RotateAnimationTranslateAnimation。完成旋转后,我将使用TranslateAnimation保存图像。它工作正常,但完成旋转,图像闪烁一次。

public void Trainplace(int x,int y,Bitmap b){
     param.setMargins(x, y, 0, 0);
     Train.setLayoutParams(param);
     Train.setImageBitmap(b);
    Train.setVisibility(0);
}
public void Trainmove(int x){
    TAnimation=new TranslateAnimation(0, 0, 0,x);
    TAnimation.setInterpolator(new LinearInterpolator());
    TAnimation.setDuration(2000);
    TAnimation.setFillAfter(true);
    //TAnimation.setFillBefore(true);
    Train.startAnimation(TAnimation);
}
public void Trainrotate(int a,int b,int c,int d){

    RAnimation=new RotateAnimation(a,b,c,d);
    RAnimation.setInterpolator(new LinearInterpolator());
    RAnimation.setDuration(2000);
    RAnimation.setFillAfter(true);
    Train.startAnimation(RAnimation);
}

public void onClick(View v) {
    switch (v.getId()) {

    case R.id.b:


        Trainplace(20, 255,bmpy1);
        Trainrotate(0,90,50,25);

        //Stop button clicks
        //B.setEnabled(false);

        break;


    case R.id.b2:
        Trainplace(35, 230,bmpx1);
        Trainrotate(0,-90,20,-30);

        RAnimation.setAnimationListener(new AnimationListener() {


            public void onAnimationStart(Animation arg0) {

            }

            public void onAnimationRepeat(Animation arg0) {

            }


            public void onAnimationEnd(Animation arg0) {

                int p=0;
                while(p<=1){
                if(RAnimation.hasEnded()){
                    Toast.makeText(getApplicationContext(), "End", Toast.LENGTH_SHORT).show();
                p=2;
                }
                }


                Trainplace(85, 170,bmpy1);

                Trainmove(-100);
            }
        });


        break;

我的问题是完成旋转动画 - 当前图像被另一个图像替换(例如我的火车图像旋转了90度,然后我在该位置旋转了90度旋转图像)然后使用Translateanimation向前移动这是有效的。

在中间放置图像时,在完成Rotateanimation之后和开始Translateanimation之前,火车图像会闪烁一次。

相同的图像将与noproblem放置(意味着Translateanimation到Rotateanimation)。

1 个答案:

答案 0 :(得分:0)

当我在动画中眨眼时,很可能是因为动画侦听器'onAnimationEnd'在动画实际完成之前就会被激活。

您可以创建自定义视图或布局,并覆盖其“animationEnd”方法并添加界面,以便设置侦听器。

这是一个例子

CustomLayout类

public class CustomLayout extends LinearLayout {
    private LayoutAnimationListener mListner;

    public CustomLayout(Context context) {
        super(context);
    }

    public CustomLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onAnimationEnd() {
        super.onAnimationEnd();
        if(mListner != null){
            mListner.onAnimationEnd(CustomLayout.this);
        }
    }

    @Override
    protected void onAnimationStart() {
        super.onAnimationStart();
        if(mListner != null){
            mListner.onAnimationStart(CustomLayout.this);
        }
    }

    public static interface LayoutAnimationListener {
        //Notifies the start of the animation.
        void onAnimationStart(CustomLayout cLayout);
        //Notifies the end of the animation.
        void onAnimationEnd(CustomLayout cLayout);
    }

    public void setLayoutAnimationListener(LayoutAnimationListener listener){
        mListner = listener;
    }
}

因此,在您的活动中,您可以将其用作普通的线性布局,而不是向动画中添加动画侦听器,您可以将其添加到布局中,如

    com.blessan.CustomLayout layout   = 
            (com.blessan.CustomLayout)findViewById(R.id.counts_layout);
    LayoutAnimationListener layoutAnimListener = new LayoutAnimationListener() {           
        @Override
        public void onAnimationStart(CustomLayout cLayout) {

        }

        @Override
        public void onAnimationEnd(CustomLayout cLayout) {

        }

    };
    layout.setLayoutAnimationListener(layoutAnimListener);

这可能适合你。试一试。