2

我有两个动画 xml 文件,我在 java 类中使用它们。我希望我的动画重复 1000 毫秒。我写了这段代码,但是当我运行这个程序时,动画不会重复。我在 repeatAnim() 函数中使用 Timer,但我认为这在 1000 毫秒内不起作用。

相对的.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
    android:id="@+id/txt1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/txt1" 
   ></TextView>
<ImageButton
    android:id="@+id/btn2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/pic1"
    android:layout_gravity="center"/>
</LinearLayout>

开关类.java:

public class SwitchClass extends Activity implements AnimationListener{

Animation animation1;
Animation animation2;
boolean frontButton=true;
ImageButton btn;
Timer timer;
TimerTask mTimerTask;
Handler handler=new Handler();

boolean repeat=true;

@Override
public void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);
     setContentView(R.layout.relative);

         animation1=AnimationUtils.loadAnimation(this, R.anim.to_middle);
     animation1.setAnimationListener(this);
     animation2=AnimationUtils.loadAnimation(this, R.anim.from_middle);
     animation2.setAnimationListener(this);

     btn=(ImageButton)findViewById(R.id.btn2);
     btn.setOnClickListener(onClickListener);

     repeatAnimation(); 
     repeatAnim();       
}

private OnClickListener onClickListener=new OnClickListener(){

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Intent intent=new Intent(SwitchClass.this,AnimClass.class);
        startActivity(intent);
    }

};

@Override
public void onAnimationEnd(Animation animation) {
    // TODO Auto-generated method stub
    if(animation==animation1){
        if(frontButton){
            btn.setImageResource(R.drawable.pic2);
        }
        else{
            btn.setImageResource(R.drawable.pic1);
        }
        btn.clearAnimation();
        btn.setAnimation(animation2);
        btn.startAnimation(animation2);
    }
    else{
        frontButton=!frontButton;
        btn.setEnabled(true);
    }
}

@Override
public void onAnimationRepeat(Animation animation) {
    // TODO Auto-generated method stub

}

@Override
public void onAnimationStart(Animation animation) {
    // TODO Auto-generated method stub

}

public void repeatAnim(){
    timer=new Timer();
    mTimerTask=new TimerTask(){
        public void run(){
            handler.post(new Runnable(){
                public void run(){
                    repeatAnimation();

                }
            });
        }
    };
    timer.schedule(mTimerTask, 1000);
}
public void repeatAnimation(){
    btn.setEnabled(false);
    btn.clearAnimation();
    btn.setAnimation(animation1);
    btn.startAnimation(animation1);
}
}

感谢您的建议。干杯

4

2 回答 2

2

怎么用 use Handler,见下图:

private int mSampleDurationTime = 1000; // 1 sec
private boolean continueToRun = true;

Handler mHandler = new Handler();

mHandler.postDelayed(mRunnable, mSampleDurationTime);

mRunnable你的任务在哪里:

private final Runnable mRunnable = new Runnable() {

 //...
public void run() {

   // do your stuff here, like update
   // this block of code you going to reach every  second

   if(continueToRun == true){
    mHandler.postDelayed(mRunnable, mSampleDurationTime);
   }

 }
    ...
};

第一次调用postDelayed并调用new Runnable(). 之后,如果要继续,请调用相同的方法run()

于 2013-09-13T13:57:37.643 回答
2

为什么不使用handler.postDelayed(runnable, delay)而不是使用计时器?

另外,在按钮上设置动画后尝试使用animation1.startNow(),在设置动画后调用btn.invalidate()重绘视图

于 2013-09-13T13:57:56.363 回答