倒计时功能

最近女朋友参加一个严格的集训,除了有技能培训还有大量的体能训练,每天过的那是相当艰难......朕心痛啊!不过凡事都有始有终。作为一个有知识有理想的新时代好男儿,如何给小仙女提供些鼓励呢。哈哈,于是就想到了这个倒计时小功能的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项目地址

你可能感兴趣的:(倒计时功能)