Android呼吸燈效果實現


最近需要做一個搜索動畫的呼吸燈效果,在網上查了下有以下兩種實現方式,現記錄下來。

實現呼吸燈效果本質上都是使用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();

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM