<
手把手教你实现一个完美android倒计时
>
上一篇

Git 冲突的提交 pull merge rebase
下一篇

Android studio or idea 修改代码行的换行长度

总结是一个好习惯, 在国庆前的休闲时间, 何不做个小结. 接下来我们手把手写一个完美的Android倒计时。源码在后面

主要使用到的api:

Android原生倒计时

android.os.CountDownTimer

持久化

android.content.SharedPreferences

日期选择器

android.app.DatePickerDialog

时间选择器

android.app.TimePickerDialog

开始撸代码

可以直接在Activity的onCreate生成(当然你可以还有很多种方法定义一个用来显示的TextView)

private TextView mTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FrameLayout frameLayout = new FrameLayout(this);
    mTextView = new TextView(this);
    mTextView.setGravity(Gravity.CENTER);
    mTextView.setTextSize(20);
    frameLayout.addView(mTextView);
    setContentView(frameLayout);
    mTextView.setText("点击我选择日期时间开始倒计时");
    mTextView.setOnClickListener(this);//需要Activity实现View.OnClickListener
}

@Override
public void onClick(View v) {
	setDate();
}
private class HuaShuiCountDownTimer extends CountDownTimer {
    HuaShuiCountDownTimer(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }
    @Override
    public void onTick(long millisUntilFinished) {
        int millisecond = (int) (millisUntilFinished % 1000);
        int second = (int) (millisUntilFinished / 1000 % 60);
        int minute = (int) (millisUntilFinished / 1000 / 60 % 60);
        int hour = (int) (millisUntilFinished / 1000 / 60 / 60 % 24);
        int day = (int) (millisUntilFinished / 1000 / 60 / 60 / 24);
        String d = day + "天"
                + String.format(Locale.getDefault(), "%02d", hour) + "小时"
                + String.format(Locale.getDefault(), "%02d", minute) + "分钟\n"
                + String.format(Locale.getDefault(), "%02d", second) + "秒"
                + String.format(Locale.getDefault(), "%03d", millisecond) + "毫秒";
        mTextView.setText("倒计时:\n" + d);
    }
    @Override
    public void onFinish() {
        mTextView.setText("老子解放啦");
    }
}

定义变量用于保存和持久化选择了的时间点

private String mPickTime;
private SharedPreferences mSharedPreferences;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...
    mSharedPreferences = getSharedPreferences(getClass().getName(), Context.MODE_PRIVATE);
}

选择日期

/**
 * 调用日期选择器设置日期
 */
private void setDate() {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    DatePickerDialog datePickerDialog =
            new DatePickerDialog(this, this, year, month, day);//需要Activity实现DatePickerDialog.OnDateSetListener
    datePickerDialog.show();
}

@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    mPickTime = String.format(Locale.getDefault(), "%04d", year)
            + String.format(Locale.getDefault(), "%02d", (month + 1))
            + String.format(Locale.getDefault(), "%02d", dayOfMonth);
    setTime();
}

选择时间

/**
 * 调用时间选择器设置时间
 */
private void setTime() {
    Calendar calendar = Calendar.getInstance();
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    int minute = calendar.get(Calendar.MINUTE);
    TimePickerDialog timePickerDialog =
            new TimePickerDialog(this, this, hour, minute, true);//需要Activity实现TimePickerDialog.OnTimeSetListener
    timePickerDialog.show();
}

@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
    mPickTime += String.format(Locale.getDefault(), "%02d", hourOfDay)
            + String.format(Locale.getDefault(), "%02d", minute);
	//本地持久化
    mSharedPreferences.edit().putString(getClass().getName(), mPickTime).apply();
	//开始倒计时
    startCountDown();
}

private HuaShuiCountDownTimer mCountDownTimer;

private void startCountDown() {
    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmm", Locale.getDefault());
    try {
        Date date = format.parse(mPickTime);
        Date nowData = new Date();
        long dL = date.getTime() - nowData.getTime();
        if (mCountDownTimer != null) {
            mCountDownTimer.cancel();
        }
        mCountDownTimer = new HuaShuiCountDownTimer(dL, 1);
        mCountDownTimer.start();
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...
    mPickTime = mSharedPreferences.getString(getClass().getName(), mPickTime);
    if (mPickTime != null) {
        startCountDown();
    }
}

附上Activity的完整代码

package cn.mozhx.countdowntimer;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.Gravity;
import android.view.View;
import android.widget.DatePicker;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.TimePicker;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
 * @author Harry
 */
@SuppressLint("SetTextI18n")
public class CountDownTimerAty extends Activity implements TimePickerDialog.OnTimeSetListener,
        DatePickerDialog.OnDateSetListener, View.OnClickListener {

    private TextView mTextView;
    private String mPickTime;
    private HuaShuiCountDownTimer mCountDownTimer;
    private SharedPreferences mSharedPreferences;

    @Override
    public void onClick(View v) {
        setDate();
    }

    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        mPickTime = String.format(Locale.getDefault(), "%04d", year)
                + String.format(Locale.getDefault(), "%02d", (month + 1))
                + String.format(Locale.getDefault(), "%02d", dayOfMonth);
        setTime();
    }

    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        mPickTime += String.format(Locale.getDefault(), "%02d", hourOfDay)
                + String.format(Locale.getDefault(), "%02d", minute);
        mSharedPreferences.edit().putString(getClass().getName(), mPickTime).apply();
        startCountDown();
    }

    private void setDate() {
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        DatePickerDialog datePickerDialog =
                new DatePickerDialog(this, this, year, month, day);
        datePickerDialog.show();
    }

    private void setTime() {
        Calendar calendar = Calendar.getInstance();
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);
        TimePickerDialog timePickerDialog =
                new TimePickerDialog(this, this, hour, minute, true);
        timePickerDialog.show();
    }

    private void startCountDown() {
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmm", Locale.getDefault());
        try {
            Date date = format.parse(mPickTime);
            Date nowData = new Date();
            long dL = date.getTime() - nowData.getTime();
            if (mCountDownTimer != null) {
                mCountDownTimer.cancel();
            }
            mCountDownTimer = new HuaShuiCountDownTimer(dL, 1);
            mCountDownTimer.start();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameLayout frameLayout = new FrameLayout(this);
        mTextView = new TextView(this);
        mTextView.setGravity(Gravity.CENTER);
        mTextView.setTextSize(20);
        frameLayout.addView(mTextView);
        setContentView(frameLayout);

        mTextView.setText("点击我选择日期时间开始倒计时");
        mTextView.setOnClickListener(this);

        mSharedPreferences = getSharedPreferences(getClass().getName(), Context.MODE_PRIVATE);
        mPickTime = mSharedPreferences.getString(getClass().getName(), mPickTime);
        if (mPickTime != null) {
            startCountDown();
        }
    }

    private class HuaShuiCountDownTimer extends CountDownTimer {
        HuaShuiCountDownTimer(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        @Override
        public void onTick(long millisUntilFinished) {
            int millisecond = (int) (millisUntilFinished % 1000);
            int second = (int) (millisUntilFinished / 1000 % 60);
            int minute = (int) (millisUntilFinished / 1000 / 60 % 60);
            int hour = (int) (millisUntilFinished / 1000 / 60 / 60 % 24);
            int day = (int) (millisUntilFinished / 1000 / 60 / 60 / 24);
            String d = day + "天"
                    + String.format(Locale.getDefault(), "%02d", hour) + "小时"
                    + String.format(Locale.getDefault(), "%02d", minute) + "分钟\n"
                    + String.format(Locale.getDefault(), "%02d", second) + "秒"
                    + String.format(Locale.getDefault(), "%03d", millisecond) + "毫秒";
            mTextView.setText("倒计时:\n" + d);
        }

        @Override
        public void onFinish() {
            mTextView.setText("老子解放啦");
        }
    }

}

github地址

gitee地址

Top
Foot