一、MainActivity.java
(一)onCreate()
Animation welcomeAnimation = AnimationUtils.loadAnimation(this, R.anim.welcome);//从res文件夹的anim文件夹中取出动画资源
welcomeTextView.setAnimation(welcomeAnimation);
welcomeAnimation.setAnimationListener(new AnimationListener() {//设置动画的监听事件,达到控制动画的目的
public void onAnimationStart(Animation animation) {}//动画开始时执行的操作
public void onAnimationRepeat(Animation animation) {}//当动画重复播放时执行的操作
public void onAnimationEnd(Animation animation) {//结束时执行的操作
Intent intent = new Intent(MainActivity.this,RocketShowActivity.class);//结束时执行页面跳转
startActivity(intent);}});
(二)private void findViews()
变量也只有控件 TextView:welcomeTextView
二、RocketShowActivity.java
(一)变量:
ImageView:bombImageView、rocketImageView
Button:rocketFireButton、shootButton
帧动画 AnimationDrawable:rocketFireAnimation、moonBombAnimation、changeFlyAnimation
补间动画 Animation:rocketShootAnimation
SoundPool: soundPool
(二)onCreate(Bundle savedInstanceState)
findViews();
getAnimation();
setlistener();
setAnimationListener();
loadSound();
(三)private void loadSound()
soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 1);
soundPool.load(RocketShowActivity.this, R.raw.rock_fast, 1);
SoundPool()参数1:同时播放的音频的数量 参数2:播放的音频的类型 参数3:播放音频的质量
load()参数1:上下文 参数2:音频的资源ID 参数3:优先级
在需要播放的地方添加.play()方法。
(四)private void setAnimationListener()
1.rocketShootAnimation.setAnimationListener
(1)public void onAnimationStart(Animation animation)
(2)public void onAnimationRepeat(Animation animation)
(3)public void onAnimationEnd(Animation animation)
rocketImageView.setVisibility(View.GONE);//把控件移走
bombImageView.setVisibility(View.VISIBLE);//要播放动画的控件显示可见
soundPool.play(1, 1, 1, 1, 0, 1);
moonBombAnimation.start();//播放动画
moonBombAnimation.setOneShot(true);//只播放一遍
帧动画无法设置监听,设置计时器已达到监听的目的
int duration = 0;
for (int i = 0; i < moonBombAnimation.getNumberOfFrames(); i++) {
duration = duration + moonBombAnimation.getDuration(i);}
Handler handler = new Handler();//通过handler新建线程刷新
handler.postDelayed(new Runnable() {
public void run() {
bombImageView.setBackgroundResource(R.drawable.change_animation);
changeFlyAnimation = (AnimationDrawable) bombImageView.getBackground();
changeFlyAnimation.start();
shootButton.setText("再来一次");}}, duration); }});
(五)private void setlistener()
1.rocketFireButton.setOnClickListener()
参数里新建匿名类new OnClickListener() ,在匿名类自带的void onClick(View v)的方法中实现代码
if (rocketFireAnimation.isRunning()) {//如果动画在执行
Toast.makeText(RocketShowActivity.this, "已点火成功,请发射", 1).show();//则显示吐司,参数依次为:上下文、显示的内容、隔多长时间显示(秒)。用show函数显示
} else {rocketFireAnimation.start();} //播放帧动画
2.shootButton.setOnClickListener
if (rocketFireAnimation.isRunning()) { //如果在运行
rocketImageView.startAnimation(rocketShootAnimation); //补间动画的播放
} else if (changeFlyAnimation != null && changeFlyAnimation.isRunning()) {
rocketImageView.setVisibility(View.VISIBLE);//通过控件ImageView设置动画可见。在xml中设置的是不可见
changeFlyAnimation.stop();//帧动画的停止
bombImageView.setBackgroundResource(R.drawable.bomb_animation);
bombImageView.setVisibility(View.GONE *);//见下方注释
} else {Toast.makeText(RocketShowActivity.this, "请先点火再发射", 1).show();}
VISIBLE:设置控件可见 ;INVISIBLE:设置控件不可见;GONE:设置控件隐藏。而INVISIBLE和GONE的主要区别是:当控件visibility属性为INVISIBLE时,界面保留了view控件所占有的空间;而控件属性为GONE时,界面则不保留view控件所占有的空间。
(六)private void getAnimation()
获取Animation,帧动画和补间动画不同。帧动画 先告诉ImageViewBackgroundResource,从R文件里引入animation动画;再把ImageView的background赋值给AnimationDrawable。补间动画 直接用AnimationUtils.loadAnimation( ) 给Animation赋值。
rocketImageView.setBackgroundResource(R.drawable.rocket_fire_animation);//帧动画
rocketFireAnimation = (AnimationDrawable) rocketImageView.getBackground();
bombImageView.setBackgroundResource(R.drawable.bomb_animation);
moonBombAnimation = (AnimationDrawable) bombImageView.getBackground();
rocketShootAnimation = AnimationUtils.loadAnimation(this,R.anim.rocket_fly_animation);//补间动画
(七)private void findViews().
找控件:bombImageView(R.id.roc_boom_img)、rocketFireButton(R.id.roc_rocket_fire_btn)、rocketImageView(R.id.roc_rocket_img)、shootButton(R.id.roc_shoot_btn)