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