美文网首页
倒计时功能

倒计时功能

作者: 西门雅虎 | 来源:发表于2019-10-22 10:57 被阅读0次

    最近女朋友参加一个严格的集训,除了有技能培训还有大量的体能训练,每天过的那是相当艰难......朕心痛啊!不过凡事都有始有终。作为一个有知识有理想的新时代好男儿,如何给小仙女提供些鼓励呢。哈哈,于是就想到了这个倒计时小功能的app。
    初步思考,需求相当简单,界面就一个小功能就是距离某个日子还有多久(xx天xx小时xx分钟xx秒)并且实时变换最好。若单有这个略显单调,可以加上一句鼓励的话,贴上小仙女的美照,同时响起醉人的音乐那就可以齐活了。
    首先时倒计时功能:知道目标日期(精确到秒),获取现在的实时日期(精确到秒)。相减,求出差距,然后换算成“xx天xx小时xx分钟xx秒”即可。关于实时变化,我想到的是用CountDownTimer这个类,没过1000毫秒自动调用一下onTick方法也就是我们的一秒变化。美照用ImageView,音乐播放就用MediaPlayer即可。以下是我的关键代码

    package com.simon.datecountdown;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.os.CountDownTimer;
    import android.widget.TextView;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    public class MainActivity extends AppCompatActivity {
    
        private TextView mTvTimeCountDown;
        private Date mFinalDate;
        private SimpleDateFormat mSimpleDateFormat;
        private MediaPlayer mMediaPlayer;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mTvTimeCountDown = findViewById(R.id.tv_time_count_down);
            mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            try {
                mFinalDate = mSimpleDateFormat.parse("2019-11-29 00:00:00");
            } catch (ParseException e) {
                e.printStackTrace();
            }
    
            if (mMediaPlayer == null) {
                mMediaPlayer = MediaPlayerControler.getInstance(this);
                mMediaPlayer.setLooping(true);
                mMediaPlayer.start();
            }
        }
    
        @Override
        protected void onResume() {
            super.onResume();
    
            final long finalTimeInMIlls = mFinalDate.getTime();
            if (Calendar.getInstance().getTimeInMillis() < finalTimeInMIlls) {
                new CountDownTimer(finalTimeInMIlls - (new Date().getTime()), 1000) {
                    @Override
                    public void onTick(long millisUntilFinished) {
                        long durationInMills = (finalTimeInMIlls - new Date().getTime()) / 1000;
                        int durationDays = (int) (durationInMills / (60 * 60 * 24));
                        int temp = (int) (durationInMills % (60 * 60 * 24));
                        int durationHours = temp / (60 * 60);
                        int temp2 = temp % (60 * 60);
                        int durationMins = temp2 / 60;
                        int durationMills = temp2 % 60;
    
                        mTvTimeCountDown.setText(String.format("%02d天%02d小时%02d分钟%02d秒",
                                durationDays, durationHours, durationMins, durationMills));
                    }
    
                    @Override
                    public void onFinish() {
                        mTvTimeCountDown.setText("解放喽!哈哈");
                    }
                }.start();
            }
        }
    
        @Override
        protected void onPause() {
            super.onPause();
        }
    }
    
    

    对MediaPlayer使用了一个单例模式

    package com.simon.datecountdown;
    
    import android.content.Context;
    import android.media.MediaPlayer;
    
    public class MediaPlayerControler {
        private static MediaPlayer sMediaPlayer;
    
        private MediaPlayerControler() {
        }
    
    
        public static MediaPlayer getInstance(Context context) {
            if (sMediaPlayer == null) {
                sMediaPlayer = MediaPlayer.create(context, R.raw.canon);
            }
            return sMediaPlayer;
        }
    }
    
    

    因为需求简单没有用Service在后台播放音乐,只是在Activity中播放的音乐。但还是有一些小小的问题,比如app切后台然后再切前台时就会重新播放音乐,这里使用if条件判断和单例来避免。来看看成品图吧!


    DateCountDown.gif

    GitHub项目地址

    相关文章

      网友评论

          本文标题:倒计时功能

          本文链接:https://www.haomeiwen.com/subject/viafvctx.html