最近需要做一個搜索動畫的呼吸燈效果,在網上查了下有以下兩種實現方式,現記錄下來。
實現呼吸燈效果本質上都是使用ImageView動畫,實現alpha值變化。
第一種方式,直接使用動畫實現,代碼如下:
private final int BREATH_INTERVAL_TIME = 1000; //設置呼吸燈時間間隔
private AlphaAnimation animationFadeIn;
private AlphaAnimation animationFadeOut;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mode_select_layout);
breathImageView = (ImageView)findViewById(R.id.breathImageView);
animationFadeIn = new AlphaAnimation(0.1f, 1.0f);
animationFadeIn.setDuration(BREATH_INTERVAL_TIME);
// animationFadeIn.setStartOffset(100);
animationFadeOut = new AlphaAnimation(1.0f, 0.1f);
animationFadeOut.setDuration(BREATH_INTERVAL_TIME);
// animationFadeIn.setStartOffset(100);
animationFadeIn.setAnimationListener(new Animation.AnimationListener(){
@Override
public void onAnimationEnd(Animation arg0) {
breathImageView.startAnimation(animationFadeOut);
}
@Override
public void onAnimationRepeat(Animation arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationStart(Animation arg0) {
// TODO Auto-generated method stub
}
});
animationFadeOut.setAnimationListener(new Animation.AnimationListener(){
@Override
public void onAnimationEnd(Animation arg0) {
breathImageView.startAnimation(animationFadeIn);
}
@Override
public void onAnimationRepeat(Animation arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationStart(Animation arg0) {
// TODO Auto-generated method stub
}
});
breathImageView.startAnimation(animationFadeOut);
}
第二種方式,使用timer實現,代碼如下:
增加動畫alpha_fade_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:fillEnabled="true" >
<alpha
android:duration="1500"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
alpha_fade_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:fillEnabled="true" >
<alpha
android:duration="1500"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
Activity中代碼:
private ImageView breathImageView;
private Timer timer;
private boolean isOpen = true;
private int index = 0;
private final int BREATH_INTERVAL_TIME = 1000; //設置呼吸燈時間間隔
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mode_select_layout);
breathImageView = (ImageView)findViewById(R.id.breathImageView);
startTimer();
}
public Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
breathImageView.clearAnimation();
breathImageView.setAnimation(getFadeIn());
break;
case 2:
breathImageView.clearAnimation();
breathImageView.setAnimation(getFadeOut());
break;
}
super.handleMessage(msg);
}
};
private Animation getFadeIn() {
Animation fadeIn = AnimationUtils.loadAnimation(ModeSelectPage.this,
R.anim.alpha_fade_in);
fadeIn.setDuration(BREATH_INTERVAL_TIME);
fadeIn.setStartOffset(100);
return fadeIn;
}
private Animation getFadeOut() {
Animation fadeOut = AnimationUtils.loadAnimation(ModeSelectPage.this,
R.anim.alpha_fade_out);
fadeOut.setDuration(BREATH_INTERVAL_TIME);
fadeOut.setStartOffset(100);
return fadeOut;
}
private void startTimer() {
timer = new Timer(true);
TimerTask task = new TimerTask() {
@Override
public void run() {
if (isOpen) {
if (index == 2) {
index = 0;
}
index++;
Message message = new Message();
message.what = index;
handler.sendMessage(message);
}
}
};
timer.schedule(task, 0, BREATH_INTERVAL_TIME); // 延時0ms后執行,5000ms執行一次
}
@Override
protected void onDestroy() {
isOpen = false;
if (timer != null) {
timer.cancel();// 退出計時器
}
timer = null;
super.onDestroy();
}