Hello dear programmers!
I am trying to make an animated menu for an application that flips randomly at random time intervals between 5 viewflipper children. In between each flip, I want to "insert" an animation based on frame by frame drawables. So far, I was able to display either the random flipping or the animation based on whether the call for the animation method is at the beginning of the "run" method or at the end. I can't figure out how to make sure that it is executed "in between" each iteration of the handler.
Here is the code:
public class BTG extends Activity {
private ViewFlipper fliptest;
private Handler testHandler = new Handler();
private Random mRand = new Random();
private Random timerMenu = new Random();
int randomTime;
AnimationDrawable menuAnimation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_btg);
fliptest = (ViewFlipper) findViewById(R.id.menuFlipper);
testHandler.postDelayed(mFlip, randomTime);
}
private Runnable mFlip = new Runnable() {
@Override
public void run() {
//if this call is at the beginning, the menu only flips between the 5 first
//children of the viewflipper and the animation is never shown
startAnimation();
randomTime = (timerMenu.nextInt(6) + 1) * 2000;
System.out.println("executes the run method " + randomTime);
fliptest.setDisplayedChild(mRand.nextInt(5));
testHandler.postDelayed(this, (mRand.nextInt(6)+ 1) * 2000);
//if this call is at the end, the menu only displays the animation
//which launches itself after a random time as set in the handler
//startAnimation();
}
class Starter implements Runnable {
public void run() {
menuAnimation.start();
}
}
private void startAnimation() {
System.out.println("The start Animation method is run");
fliptest.setDisplayedChild(5);
menuAnimation = new AnimationDrawable();
menuAnimation.addFrame(getResources().getDrawable(R.drawable.animate_menu_trans1), 100);
menuAnimation.addFrame(getResources().getDrawable(R.drawable.animate_menu_trans2), 100);
menuAnimation.addFrame(getResources().getDrawable(R.drawable.animate_menu_trans3), 100);
menuAnimation.addFrame(getResources().getDrawable(R.drawable.animate_menu_trans1), 100);
menuAnimation.addFrame(getResources().getDrawable(R.drawable.animate_menu_trans2), 100);
menuAnimation.addFrame(getResources().getDrawable(R.drawable.animate_menu_trans3), 100);
menuAnimation.setOneShot(true);
ImageView imageView = (ImageView) findViewById(R.id.menu_animation);
imageView.setImageDrawable(menuAnimation);
imageView.post(new Starter());
}
};
OK, so after playing around and spending hours on Stackoverflow, I found a workable solution to my problem. Here is the final code. PLEASE feel free to propose a "better" programming alternative as this is just my newbie fix!
public class BTG extends Activity {
private ViewFlipper fliptest;
private Handler menuHandler = new Handler();
private Random mRand = new Random();
private Random timerMenu = new Random();
int randomTime;
AnimationDrawable menuAnimation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_btg);
fliptest = (ViewFlipper) findViewById(R.id.menuFlipper);
menuHandler.postDelayed(mFlip, randomTime);
}
private Runnable mFlip = new Runnable() {
@Override
public void run() {
randomTime = (timerMenu.nextInt(6) + 1) * 2000;
System.out.println("executes the run method " + randomTime);
menuHandler.postDelayed(this, randomTime);
startAnimation();
}
};
class Starter implements Runnable {
public void run() {
menuAnimation.start();
}
}
private void startAnimation() {
System.out.println("The start Animation method is run");
fliptest.setDisplayedChild(5);
menuAnimation = new AnimationDrawable();
menuAnimation.addFrame(getResources().getDrawable(R.drawable.animate_menu_trans1), 100);
menuAnimation.addFrame(getResources().getDrawable(R.drawable.animate_menu_trans2), 100);
menuAnimation.addFrame(getResources().getDrawable(R.drawable.animate_menu_trans3), 100);
menuAnimation.addFrame(getResources().getDrawable(R.drawable.animate_menu_trans1), 100);
menuAnimation.addFrame(getResources().getDrawable(R.drawable.animate_menu_trans2), 100);
menuAnimation.addFrame(getResources().getDrawable(R.drawable.animate_menu_trans3), 100);
menuAnimation.setOneShot(true);
ImageView imageView = (ImageView) findViewById(R.id.menu_animation);
imageView.setImageDrawable(menuAnimation);
imageView.post(new Starter());
Thread timer = new Thread(){
public void run (){
try{
sleep(700);
}catch (InterruptedException e){
e.printStackTrace();
}finally{
System.out.println("the thread sleep works");
runOnUiThread(new Runnable() {
@Override
public void run() {
fliptest.setDisplayedChild(mRand.nextInt(5));
}
});
}
}
};
timer.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.beat_the_game, menu);
return true;
}
}