一、前言:
这是自己本地封装了一个类似Ios的时间选择控件,不用导入任何依赖,复制几个类就可以实现时间的选择,有些同学嫌麻烦的话,可以采用Android 仿 Ios时间选择控件(一)来实现。
gitHub地址:https://gitee.com/luoyanyong/CalendarDemo.git
效果图如下:

二、使用:
1、基本使用
private String startTime;
//设置日历开始范围(可以不设置,默认1950-01-01 01:00)
TimeSelector.setStartTime("1990-01-01 01:00");
//设置日历结束范围(可以不设置,默认2050-01-01 01:00)
TimeSelector.setEndTime("2052-01-01 01:00");
//获取对象
TimeSelector timeSelector = new TimeSelector(MainActivity.this, new TimeSelector.ResultHandler() {
@Override
public void handle(String time) {
startTime = time;
tv_content.setText(time);
}
}, startTime);
//只显示 年月日
timeSelector.setMode(TimeSelector.MODE.YMD);
//标题设置
timeSelector.setTitle("选择日期");
timeSelector.setTitleColor(R.color.colorAccent);
//取消设置
timeSelector.setCancle("取消");
timeSelector.setCancleColor(R.color.colorPrimary);
//选择设置
timeSelector.setNextSelect("选择");
timeSelector.setNextSelectColor(R.color.colorAccent);
//一定要调用这个显示
timeSelector.show();
2、MainActivity类
public class MainActivity extends AppCompatActivity {
private Button btn;
private TextView tv_content;
private String startTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = findViewById(R.id.btn);
tv_content = findViewById(R.id.tv_content);
initData();
}
private void initData() {
/**
* 日历弹窗
*/
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
//设置日历开始范围
TimeSelector.setStartTime("1970-01-01 01:00");
//设置日历结束范围
TimeSelector.setEndTime("2052-01-01 01:00");
//获取对象
TimeSelector timeSelector = new TimeSelector(MainActivity.this, new TimeSelector.ResultHandler() {
@Override
public void handle(String time) {
startTime = time;
tv_content.setText(time);
}
}, startTime);
//只显示 年月日
timeSelector.setMode(TimeSelector.MODE.YMD);
//标题设置
timeSelector.setTitle("选择日期");
timeSelector.setTitleColor(R.color.colorAccent);
//取消设置
timeSelector.setCancle("取消");
timeSelector.setCancleColor(R.color.colorPrimary);
//选择设置
timeSelector.setNextSelect("选择");
timeSelector.setNextSelectColor(R.color.colorAccent);
//一定要调用这个显示
timeSelector.show();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
3、TimeSelector 类
/**
* 时间选择器
*/
public class TimeSelector {
private static String startTime;
private static String endTime;
private String startTimeDefault = "1950-01-01 01:00";
private String endTimeDefault = "2050-01-01 01:00";
public interface ResultHandler {
void handle(String time);
}
public enum SCROLLTYPE {
HOUR(1),
MINUTE(2);
private SCROLLTYPE(int value) {
this.value = value;
}
public int value;
}
public enum MODE {
YMD(1),
YMDHM(2);
private MODE(int value) {
this.value = value;
}
public int value;
}
private int scrollUnits = SCROLLTYPE.HOUR.value + SCROLLTYPE.MINUTE.value;
private ResultHandler handler;
private Context context;
private final String FORMAT_STR = "yyyy-MM-dd HH:mm";
private final String FORMAT_STR_DATE = "yyyy-MM-dd";
private Dialog seletorDialog;
private PickerView year_pv;
private PickerView month_pv;
private PickerView day_pv;
private PickerView hour_pv;
private PickerView minute_pv;
private final int MAXMINUTE = 59;
private int MAXHOUR = 23;
private final int MINMINUTE = 0;
private int MINHOUR = 0;
private final int MAXMONTH = 12;
private ArrayList<String> year, month, day, hour, minute;
private int startYear, startMonth, startDay, startHour, startMininute, endYear, endMonth, endDay, endHour, endMininute, minute_workStart, minute_workEnd, hour_workStart, hour_workEnd;
private int startSelectYear, startSelectMonth, startSelectDay, startSelectHour, startSelectMininute;
private boolean spanYear, spanMon, spanDay, spanHour, spanMin;
private Calendar selectedCalender = Calendar.getInstance();
private final long ANIMATORDELAY = 200L;
private final long CHANGEDELAY = 90L;
private String workStart_str;
private String workEnd_str;
private Calendar startCalendar;
private Calendar startVisibleCalendar;
private Calendar endCalendar;
private TextView tv_cancle;
private TextView tv_select, tv_title;
private TextView hour_text;
private TextView minute_text;
private int modelValue = 2;
/**
* 构造方法1
*
* @param context
* @param resultHandler
* @param currentDate
*/
public TimeSelector(Context context, ResultHandler resultHandler, String currentDate) {
this.context = context;
this.handler = resultHandler;
try {
startCalendar = Calendar.getInstance();
startVisibleCalendar = Calendar.getInstance();
endCalendar = Calendar.getInstance();
//日历的开始时间范围
if (!TextUtil.isEmpty(startTime)) {
startCalendar.setTime(DateTimeHelper.parse(startTime, FORMAT_STR));
} else {
startCalendar.setTime(DateTimeHelper.parse(startTimeDefault, FORMAT_STR));
}
//显示当前时间判断
if (!TextUtil.isEmpty(currentDate)) {
if (currentDate.length() == 16) {
startVisibleCalendar.setTime(DateTimeHelper.parse(currentDate, FORMAT_STR));
} else {
startVisibleCalendar.setTime(DateTimeHelper.parse(currentDate + " 00:00", FORMAT_STR));
}
} else {
startVisibleCalendar.setTime(DateTimeHelper.parse(DateTimeHelper.format(new Date(), FORMAT_STR), FORMAT_STR));
}
//结束时间默认是今天
if (!TextUtil.isEmpty(endTime)) {
endCalendar.setTime(DateTimeHelper.parse(endTime, FORMAT_STR));
} else {
endCalendar.setTime(DateTimeHelper.parse(endTimeDefault, FORMAT_STR));
}
initDialog();
initView();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 构造方法2
*
* @param context
* @param resultHandler
* @param currentDate
* @param endDate
*/
public TimeSelector(Context context, ResultHandler resultHandler, String currentDate, String endDate) {
this.context = context;
this.handler = resultHandler;
try {
startCalendar = Calendar.getInstance();
startVisibleCalendar = Calendar.getInstance();
endCalendar = Calendar.getInstance();
//日历的开始时间范围
//日历的开始时间范围
if (!TextUtil.isEmpty(startTime)) {
startCalendar.setTime(DateTimeHelper.parse(startTime, FORMAT_STR));
} else {
startCalendar.setTime(DateTimeHelper.parse(startTimeDefault, FORMAT_STR));
}
//显示当前时间判断
if (!TextUtil.isEmpty(currentDate)) {
if (currentDate.length() == 16) {
startVisibleCalendar.setTime(DateTimeHelper.parse(currentDate, FORMAT_STR));
} else {
startVisibleCalendar.setTime(DateTimeHelper.parse(currentDate + " 00:00", FORMAT_STR));
}
} else {
startVisibleCalendar.setTime(DateTimeHelper.parse(DateTimeHelper.format(new Date(), FORMAT_STR), FORMAT_STR));
}
//结束时间默认是今天
if (!TextUtil.isEmpty(endDate)) {
endCalendar.setTime(DateTimeHelper.parse(endDate, FORMAT_STR));
} else {
endCalendar.setTime(DateTimeHelper.parse(endTimeDefault, FORMAT_STR));
}
initDialog();
initView();
} catch (Exception e) {
e.printStackTrace();
}
}
public TimeSelector(Context context, ResultHandler resultHandler, String startDate, String endDate, String workStartTime, String workEndTime) {
this(context, resultHandler, startDate, endDate);
this.workStart_str = workStartTime;
this.workEnd_str = workEndTime;
}
public void show() {
if (startCalendar.getTime().getTime() >= endCalendar.getTime().getTime()) {
Toast.makeText(context, "开始时间大于结束时间", Toast.LENGTH_LONG).show();
return;
}
if (!excuteWorkTime()) {
return;
}
initParameter();
initTimer();
addListener();
seletorDialog.show();
}
public void dismiss() {
if (seletorDialog != null)
seletorDialog.dismiss();
}
private void initDialog() {
if (seletorDialog == null) {
seletorDialog = new Dialog(context, R.style.time_dialog);
seletorDialog.setCancelable(false);
seletorDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
seletorDialog.setContentView(R.layout.dialog_selector);
Window window = seletorDialog.getWindow();
window.setGravity(Gravity.BOTTOM);
WindowManager.LayoutParams lp = window.getAttributes();
int width = ScreenUtil.getInstance(context).getScreenWidth();
lp.width = width;
window.setAttributes(lp);
}
}
private void initView() {
year_pv = (PickerView) seletorDialog.findViewById(R.id.year_pv);
month_pv = (PickerView) seletorDialog.findViewById(R.id.month_pv);
day_pv = (PickerView) seletorDialog.findViewById(R.id.day_pv);
hour_pv = (PickerView) seletorDialog.findViewById(R.id.hour_pv);
minute_pv = (PickerView) seletorDialog.findViewById(R.id.minute_pv);
tv_cancle = (TextView) seletorDialog.findViewById(R.id.tv_cancle);
tv_select = (TextView) seletorDialog.findViewById(R.id.tv_select);
tv_title = (TextView) seletorDialog.findViewById(R.id.tv_title);
hour_text = (TextView) seletorDialog.findViewById(R.id.hour_text);
minute_text = (TextView) seletorDialog.findViewById(R.id.minute_text);
tv_cancle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
seletorDialog.dismiss();
}
});
tv_select.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (modelValue == 2) {
//默认是2,带有时分秒
handler.handle(DateTimeHelper.format(selectedCalender.getTime(), FORMAT_STR));
} else {
//1,没有时分秒
handler.handle(DateTimeHelper.format(selectedCalender.getTime(), FORMAT_STR_DATE));
}
seletorDialog.dismiss();
}
});
}
private void initParameter() {
startYear = startCalendar.get(Calendar.YEAR);
startMonth = startCalendar.get(Calendar.MONTH) + 1;
startDay = startCalendar.get(Calendar.DAY_OF_MONTH);
startHour = startCalendar.get(Calendar.HOUR_OF_DAY);
startMininute = startCalendar.get(Calendar.MINUTE);
//默认选择的时间
startSelectYear = startVisibleCalendar.get(Calendar.YEAR);
startSelectMonth = startVisibleCalendar.get(Calendar.MONTH) + 1;
startSelectDay = startVisibleCalendar.get(Calendar.DAY_OF_MONTH);
startSelectHour = startVisibleCalendar.get(Calendar.HOUR_OF_DAY);
startSelectMininute = startVisibleCalendar.get(Calendar.MINUTE);
endYear = endCalendar.get(Calendar.YEAR);
endMonth = endCalendar.get(Calendar.MONTH) + 1;
endDay = endCalendar.get(Calendar.DAY_OF_MONTH);
endHour = endCalendar.get(Calendar.HOUR_OF_DAY);
endMininute = endCalendar.get(Calendar.MINUTE);
spanYear = startYear != endYear;
spanMon = (!spanYear) && (startMonth != endMonth);
spanDay = (!spanMon) && (startDay != endDay);
spanHour = (!spanDay) && (startHour != endHour);
spanMin = (!spanHour) && (startMininute != endMininute);
selectedCalender.setTime(startVisibleCalendar.getTime());
}
private void initTimer() {
initArrayList();
if (spanYear) {
for (int i = startYear; i <= endYear; i++) {
year.add(String.valueOf(i));
}
for (int i = startMonth; i <= MAXMONTH; i++) {
month.add(fomatTimeUnit(i));
}
for (int i = startDay; i <= startVisibleCalendar.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
day.add(fomatTimeUnit(i));
}
if ((scrollUnits & SCROLLTYPE.HOUR.value) != SCROLLTYPE.HOUR.value) {
hour.add(fomatTimeUnit(startHour));
} else {
for (int i = startHour; i <= MAXHOUR; i++) {
hour.add(fomatTimeUnit(i));
}
}
if ((scrollUnits & SCROLLTYPE.MINUTE.value) != SCROLLTYPE.MINUTE.value) {
minute.add(fomatTimeUnit(startMininute));
} else {
for (int i = startMininute; i <= MAXMINUTE; i++) {
minute.add(fomatTimeUnit(i));
}
}
} else if (spanMon) {
year.add(String.valueOf(startYear));
for (int i = startMonth; i <= endMonth; i++) {
month.add(fomatTimeUnit(i));
}
for (int i = startDay; i <= startVisibleCalendar.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
day.add(fomatTimeUnit(i));
}
if ((scrollUnits & SCROLLTYPE.HOUR.value) != SCROLLTYPE.HOUR.value) {
hour.add(fomatTimeUnit(startHour));
} else {
for (int i = startHour; i <= MAXHOUR; i++) {
hour.add(fomatTimeUnit(i));
}
}
if ((scrollUnits & SCROLLTYPE.MINUTE.value) != SCROLLTYPE.MINUTE.value) {
minute.add(fomatTimeUnit(startMininute));
} else {
for (int i = startMininute; i <= MAXMINUTE; i++) {
minute.add(fomatTimeUnit(i));
}
}
} else if (spanDay) {
year.add(String.valueOf(startYear));
month.add(fomatTimeUnit(startMonth));
for (int i = startDay; i <= endDay; i++) {
day.add(fomatTimeUnit(i));
}
if ((scrollUnits & SCROLLTYPE.HOUR.value) != SCROLLTYPE.HOUR.value) {
hour.add(fomatTimeUnit(startHour));
} else {
for (int i = startHour; i <= MAXHOUR; i++) {
hour.add(fomatTimeUnit(i));
}
}
if ((scrollUnits & SCROLLTYPE.MINUTE.value) != SCROLLTYPE.MINUTE.value) {
minute.add(fomatTimeUnit(startMininute));
} else {
for (int i = startMininute; i <= MAXMINUTE; i++) {
minute.add(fomatTimeUnit(i));
}
}
} else if (spanHour) {
year.add(String.valueOf(startYear));
month.add(fomatTimeUnit(startMonth));
day.add(fomatTimeUnit(startDay));
if ((scrollUnits & SCROLLTYPE.HOUR.value) != SCROLLTYPE.HOUR.value) {
hour.add(fomatTimeUnit(startHour));
} else {
for (int i = startHour; i <= endHour; i++) {
hour.add(fomatTimeUnit(i));
}
}
if ((scrollUnits & SCROLLTYPE.MINUTE.value) != SCROLLTYPE.MINUTE.value) {
minute.add(fomatTimeUnit(startMininute));
} else {
for (int i = startMininute; i <= MAXMINUTE; i++) {
minute.add(fomatTimeUnit(i));
}
}
} else if (spanMin) {
year.add(String.valueOf(startYear));
month.add(fomatTimeUnit(startMonth));
day.add(fomatTimeUnit(startDay));
hour.add(fomatTimeUnit(startHour));
if ((scrollUnits & SCROLLTYPE.MINUTE.value) != SCROLLTYPE.MINUTE.value) {
minute.add(fomatTimeUnit(startMininute));
} else {
for (int i = startMininute; i <= endMininute; i++) {
minute.add(fomatTimeUnit(i));
}
}
}
loadComponent();
}
private boolean excuteWorkTime() {
boolean res = true;
if (!TextUtil.isEmpty(workStart_str) && !TextUtil.isEmpty(workEnd_str)) {
String[] start = workStart_str.split(":");
String[] end = workEnd_str.split(":");
hour_workStart = Integer.parseInt(start[0]);
minute_workStart = Integer.parseInt(start[1]);
hour_workEnd = Integer.parseInt(end[0]);
minute_workEnd = Integer.parseInt(end[1]);
Calendar workStartCalendar = Calendar.getInstance();
Calendar workEndCalendar = Calendar.getInstance();
workStartCalendar.setTime(startVisibleCalendar.getTime());
workEndCalendar.setTime(endCalendar.getTime());
workStartCalendar.set(Calendar.HOUR_OF_DAY, hour_workStart);
workStartCalendar.set(Calendar.MINUTE, minute_workStart);
workEndCalendar.set(Calendar.HOUR_OF_DAY, hour_workEnd);
workEndCalendar.set(Calendar.MINUTE, minute_workEnd);
Calendar startTime = Calendar.getInstance();
Calendar endTime = Calendar.getInstance();
Calendar startWorkTime = Calendar.getInstance();
Calendar endWorkTime = Calendar.getInstance();
startTime.set(Calendar.HOUR_OF_DAY, startVisibleCalendar.get(Calendar.HOUR_OF_DAY));
startTime.set(Calendar.MINUTE, startVisibleCalendar.get(Calendar.MINUTE));
endTime.set(Calendar.HOUR_OF_DAY, endCalendar.get(Calendar.HOUR_OF_DAY));
endTime.set(Calendar.MINUTE, endCalendar.get(Calendar.MINUTE));
startWorkTime.set(Calendar.HOUR_OF_DAY, workStartCalendar.get(Calendar.HOUR_OF_DAY));
startWorkTime.set(Calendar.MINUTE, workStartCalendar.get(Calendar.MINUTE));
endWorkTime.set(Calendar.HOUR_OF_DAY, workEndCalendar.get(Calendar.HOUR_OF_DAY));
endWorkTime.set(Calendar.MINUTE, workEndCalendar.get(Calendar.MINUTE));
if (startTime.getTime().getTime() == endTime.getTime().getTime() || (startWorkTime.getTime().getTime() < startTime.getTime().getTime() && endWorkTime.getTime().getTime() < startTime.getTime().getTime())) {
Toast.makeText(context, "Wrong parames!", Toast.LENGTH_LONG).show();
return false;
}
startVisibleCalendar.setTime(startVisibleCalendar.getTime().getTime() < workStartCalendar.getTime().getTime() ? workStartCalendar.getTime() : startVisibleCalendar.getTime());
endCalendar.setTime(endCalendar.getTime().getTime() > workEndCalendar.getTime().getTime() ? workEndCalendar.getTime() : endCalendar.getTime());
MINHOUR = workStartCalendar.get(Calendar.HOUR_OF_DAY);
MAXHOUR = workEndCalendar.get(Calendar.HOUR_OF_DAY);
}
return res;
}
private String fomatTimeUnit(int unit) {
return unit < 10 ? "0" + String.valueOf(unit) : String.valueOf(unit);
}
private void initArrayList() {
if (year == null) {
year = new ArrayList<>();
}
if (month == null) {
month = new ArrayList<>();
}
if (day == null) {
day = new ArrayList<>();
}
if (hour == null) {
hour = new ArrayList<>();
}
if (minute == null) {
minute = new ArrayList<>();
}
year.clear();
month.clear();
day.clear();
hour.clear();
minute.clear();
}
private void addListener() {
year_pv.setOnSelectListener(new PickerView.onSelectListener() {
@Override
public void onSelect(String text) {
selectedCalender.set(Calendar.YEAR, Integer.parseInt(text));
monthChange();
}
});
month_pv.setOnSelectListener(new PickerView.onSelectListener() {
@Override
public void onSelect(String text) {
selectedCalender.set(Calendar.DAY_OF_MONTH, 1);
selectedCalender.set(Calendar.MONTH, Integer.parseInt(text) - 1);
dayChange();
}
});
day_pv.setOnSelectListener(new PickerView.onSelectListener() {
@Override
public void onSelect(String text) {
selectedCalender.set(Calendar.DAY_OF_MONTH, Integer.parseInt(text));
hourChange();
}
});
hour_pv.setOnSelectListener(new PickerView.onSelectListener() {
@Override
public void onSelect(String text) {
selectedCalender.set(Calendar.HOUR_OF_DAY, Integer.parseInt(text));
minuteChange();
}
});
minute_pv.setOnSelectListener(new PickerView.onSelectListener() {
@Override
public void onSelect(String text) {
selectedCalender.set(Calendar.MINUTE, Integer.parseInt(text));
}
});
}
private void loadComponent() {
year_pv.setData(year);
month_pv.setData(month);
day_pv.setData(day);
hour_pv.setData(hour);
minute_pv.setData(minute);
startSelectYear = startVisibleCalendar.get(Calendar.YEAR);
startSelectMonth = startVisibleCalendar.get(Calendar.MONTH) + 1;
startSelectDay = startVisibleCalendar.get(Calendar.DAY_OF_MONTH);
startSelectHour = startVisibleCalendar.get(Calendar.HOUR_OF_DAY);
startSelectMininute = startVisibleCalendar.get(Calendar.MINUTE);
//默认显示
year_pv.setSelected(get_num(year, startSelectYear));
month_pv.setSelected(get_num(month, startSelectMonth));
day_pv.setSelected(get_num(day, startSelectDay));
hour_pv.setSelected(get_num(hour, startSelectHour));
minute_pv.setSelected(get_num(minute, startSelectMininute));
// year_pv.setSelected(0);
// month_pv.setSelected(0);
// day_pv.setSelected(0);
// hour_pv.setSelected(0);
// minute_pv.setSelected(0);
excuteScroll();
}
/**
* 判断在数组的第几位
*
* @param list
* @param b
* @return
*/
public int get_num(ArrayList<String> list, int b) {
int value = 0;
String date;
if (b < 10) {
date = "0" + b;
} else {
date = "" + b;
}
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals(date)) {
value = i;
}
}
return value;
}
private void excuteScroll() {
year_pv.setCanScroll(year.size() > 1);
month_pv.setCanScroll(month.size() > 1);
day_pv.setCanScroll(day.size() > 1);
hour_pv.setCanScroll(hour.size() > 1 && (scrollUnits & SCROLLTYPE.HOUR.value) == SCROLLTYPE.HOUR.value);
minute_pv.setCanScroll(minute.size() > 1 && (scrollUnits & SCROLLTYPE.MINUTE.value) == SCROLLTYPE.MINUTE.value);
}
private void monthChange() {
month.clear();
int selectedYear = selectedCalender.get(Calendar.YEAR);
if (selectedYear == startYear) {
for (int i = startMonth; i <= MAXMONTH; i++) {
month.add(fomatTimeUnit(i));
}
} else if (selectedYear == endYear) {
for (int i = 1; i <= endMonth; i++) {
month.add(fomatTimeUnit(i));
}
} else {
for (int i = 1; i <= MAXMONTH; i++) {
month.add(fomatTimeUnit(i));
}
}
selectedCalender.set(Calendar.MONTH, Integer.parseInt(month.get(0)) - 1);
month_pv.setData(month);
month_pv.setSelected(0);
excuteAnimator(ANIMATORDELAY, month_pv);
month_pv.postDelayed(new Runnable() {
@Override
public void run() {
dayChange();
}
}, CHANGEDELAY);
}
private void dayChange() {
day.clear();
int selectedYear = selectedCalender.get(Calendar.YEAR);
int selectedMonth = selectedCalender.get(Calendar.MONTH) + 1;
if (selectedYear == startYear && selectedMonth == startMonth) {
for (int i = startDay; i <= selectedCalender.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
day.add(fomatTimeUnit(i));
}
} else if (selectedYear == endYear && selectedMonth == endMonth) {
for (int i = 1; i <= endDay; i++) {
day.add(fomatTimeUnit(i));
}
} else {
for (int i = 1; i <= selectedCalender.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
day.add(fomatTimeUnit(i));
}
}
selectedCalender.set(Calendar.DAY_OF_MONTH, Integer.parseInt(day.get(0)));
day_pv.setData(day);
day_pv.setSelected(0);
excuteAnimator(ANIMATORDELAY, day_pv);
day_pv.postDelayed(new Runnable() {
@Override
public void run() {
hourChange();
}
}, CHANGEDELAY);
}
private void hourChange() {
if ((scrollUnits & SCROLLTYPE.HOUR.value) == SCROLLTYPE.HOUR.value) {
hour.clear();
int selectedYear = selectedCalender.get(Calendar.YEAR);
int selectedMonth = selectedCalender.get(Calendar.MONTH) + 1;
int selectedDay = selectedCalender.get(Calendar.DAY_OF_MONTH);
if (selectedYear == startYear && selectedMonth == startMonth && selectedDay == startDay) {
for (int i = startHour; i <= MAXHOUR; i++) {
hour.add(fomatTimeUnit(i));
}
} else if (selectedYear == endYear && selectedMonth == endMonth && selectedDay == endDay) {
for (int i = MINHOUR; i <= endHour; i++) {
hour.add(fomatTimeUnit(i));
}
} else {
for (int i = MINHOUR; i <= MAXHOUR; i++) {
hour.add(fomatTimeUnit(i));
}
}
selectedCalender.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour.get(0)));
hour_pv.setData(hour);
hour_pv.setSelected(0);
excuteAnimator(ANIMATORDELAY, hour_pv);
}
hour_pv.postDelayed(new Runnable() {
@Override
public void run() {
minuteChange();
}
}, CHANGEDELAY);
}
private void minuteChange() {
if ((scrollUnits & SCROLLTYPE.MINUTE.value) == SCROLLTYPE.MINUTE.value) {
minute.clear();
int selectedYear = selectedCalender.get(Calendar.YEAR);
int selectedMonth = selectedCalender.get(Calendar.MONTH) + 1;
int selectedDay = selectedCalender.get(Calendar.DAY_OF_MONTH);
int selectedHour = selectedCalender.get(Calendar.HOUR_OF_DAY);
if (selectedYear == startYear && selectedMonth == startMonth && selectedDay == startDay && selectedHour == startHour) {
for (int i = startMininute; i <= MAXMINUTE; i++) {
minute.add(fomatTimeUnit(i));
}
} else if (selectedYear == endYear && selectedMonth == endMonth && selectedDay == endDay && selectedHour == endHour) {
for (int i = MINMINUTE; i <= endMininute; i++) {
minute.add(fomatTimeUnit(i));
}
} else if (selectedHour == hour_workStart) {
for (int i = minute_workStart; i <= MAXMINUTE; i++) {
minute.add(fomatTimeUnit(i));
}
} else if (selectedHour == hour_workEnd) {
for (int i = MINMINUTE; i <= minute_workEnd; i++) {
minute.add(fomatTimeUnit(i));
}
} else {
for (int i = MINMINUTE; i <= MAXMINUTE; i++) {
minute.add(fomatTimeUnit(i));
}
}
selectedCalender.set(Calendar.MINUTE, Integer.parseInt(minute.get(0)));
minute_pv.setData(minute);
minute_pv.setSelected(0);
excuteAnimator(ANIMATORDELAY, minute_pv);
}
excuteScroll();
}
private void excuteAnimator(long ANIMATORDELAY, View view) {
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,
0f, 1f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f,
1.3f, 1f);
PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f,
1.3f, 1f);
ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY, pvhZ).setDuration(ANIMATORDELAY).start();
}
/**
* 取消内容
*
* @param str
*/
public void setCancle(String str) {
tv_cancle.setText(str);
}
/**
* 下一步内容颜色
*
* @param id
*/
public void setCancleColor(int id) {
//int id = R.color.color_FF333333;
if (id == 0) {
tv_cancle.setTextColor(BaseApplication.getInstance().getResources().getColor(R.color.color_FF333333));
} else {
tv_cancle.setTextColor(BaseApplication.getInstance().getResources().getColor(id));
}
}
/**
* 下一步内容
*
* @param str
*/
public void setNextSelect(String str) {
tv_select.setText(str);
}
/**
* 下一步内容颜色
*
* @param id
*/
public void setNextSelectColor(int id) {
//int id = R.color.color_FF333333;
if (id == 0) {
tv_select.setTextColor(BaseApplication.getInstance().getResources().getColor(R.color.color_FF333333));
} else {
tv_select.setTextColor(BaseApplication.getInstance().getResources().getColor(id));
}
}
/**
* 设置标题内容
*
* @param str
*/
public void setTitle(String str) {
tv_title.setText(str);
}
/**
* 设置标题内容颜色
*
* @param id
*/
public void setTitleColor(int id) {
//int id = R.color.color_FF333333;
if (id == 0) {
tv_title.setTextColor(BaseApplication.getInstance().getResources().getColor(R.color.color_FF333333));
} else {
tv_title.setTextColor(BaseApplication.getInstance().getResources().getColor(id));
}
}
public int disScrollUnit(SCROLLTYPE... scrolltypes) {
if (scrolltypes == null || scrolltypes.length == 0) {
scrollUnits = SCROLLTYPE.HOUR.value + SCROLLTYPE.MINUTE.value;
}
for (SCROLLTYPE scrolltype : scrolltypes) {
scrollUnits ^= scrolltype.value;
}
return scrollUnits;
}
public void setMode(MODE mode) {
switch (mode.value) {
case 1:
modelValue = 1;
disScrollUnit(SCROLLTYPE.HOUR, SCROLLTYPE.MINUTE);
hour_pv.setVisibility(View.GONE);
minute_pv.setVisibility(View.GONE);
hour_text.setVisibility(View.GONE);
minute_text.setVisibility(View.GONE);
break;
case 2:
modelValue = 2;
disScrollUnit();
hour_pv.setVisibility(View.VISIBLE);
minute_pv.setVisibility(View.VISIBLE);
hour_text.setVisibility(View.VISIBLE);
minute_text.setVisibility(View.VISIBLE);
break;
}
}
public void setIsLoop(boolean isLoop) {
this.year_pv.setIsLoop(isLoop);
this.month_pv.setIsLoop(isLoop);
this.day_pv.setIsLoop(isLoop);
this.hour_pv.setIsLoop(isLoop);
this.minute_pv.setIsLoop(isLoop);
}
/**
* 设置日历开始时间
*
* @param startTime 格式:1970-01-01 01:00
*/
public static void setStartTime(String startTime) {
TimeSelector.startTime = startTime;
}
/**
* 设置日历结束时间
*
* @param endTime 格式:1970-01-01 01:00
*/
public static void setEndTime(String endTime) {
TimeSelector.endTime = endTime;
}
}
4、PickerView 类
public class PickerView extends View {
/**
* 新增字段 控制是否首尾相接循环显示 默认为循环显示
*/
private boolean loop = true;
/**
* text之间间距和minTextSize之比
*/
public static final float MARGIN_ALPHA = 2.8f;
/**
* 自动回滚到中间的速度
*/
public static final float SPEED = 10;
private List<String> mDataList;
/**
* 选中的位置,这个位置是mDataList的中心位置,一直不变
*/
private int mCurrentSelected;
private Paint mPaint, nPaint;
private float mMaxTextSize = 80;
private float mMinTextSize = 40;
private float mMaxTextAlpha = 255;
private float mMinTextAlpha = 120;
private int mColorText = 0x333333;
private int nColorText = 0x666666;
private int mViewHeight;
private int mViewWidth;
private float mLastDownY;
/**
* 滑动的距离
*/
private float mMoveLen = 0;
private boolean isInit = false;
private onSelectListener mSelectListener;
private Timer timer;
private MyTimerTask mTask;
Handler updateHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (Math.abs(mMoveLen) < SPEED) {
mMoveLen = 0;
if (mTask != null) {
mTask.cancel();
mTask = null;
performSelect();
}
} else
// 这里mMoveLen / Math.abs(mMoveLen)是为了保有mMoveLen的正负号,以实现上滚或下滚
mMoveLen = mMoveLen - mMoveLen / Math.abs(mMoveLen) * SPEED;
invalidate();
}
};
private boolean canScroll = true;
public PickerView(Context context) {
super(context);
init();
}
public PickerView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.PickerView);
loop = typedArray.getBoolean(R.styleable.PickerView_isLoop, loop);
init();
}
public void setOnSelectListener(onSelectListener listener) {
mSelectListener = listener;
}
private void performSelect() {
if (mSelectListener != null) {
mSelectListener.onSelect(mDataList.get(mCurrentSelected));
}
}
public void setData(List<String> datas) {
mDataList = datas;
mCurrentSelected = datas.size() / 4;
invalidate();
}
/**
* 选择选中的item的index
*
* @param selected
*/
public void setSelected(int selected) {
mCurrentSelected = selected;
if (loop) {
int distance = mDataList.size() / 2 - mCurrentSelected;
if (distance < 0) {
for (int i = 0; i < -distance; i++) {
moveHeadToTail();
mCurrentSelected--;
}
} else if (distance > 0) {
for (int i = 0; i < distance; i++) {
moveTailToHead();
mCurrentSelected++;
}
}
}
invalidate();
}
/**
* 选择选中的内容
*
* @param mSelectItem
*/
public void setSelected(String mSelectItem) {
for (int i = 0; i < mDataList.size(); i++) {
if (mDataList.get(i).equals(mSelectItem)) {
setSelected(i);
break;
}
}
}
private void moveHeadToTail() {
if (loop) {
String head = mDataList.get(0);
mDataList.remove(0);
mDataList.add(head);
}
}
private void moveTailToHead() {
if (loop) {
String tail = mDataList.get(mDataList.size() - 1);
mDataList.remove(mDataList.size() - 1);
mDataList.add(0, tail);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mViewHeight = getMeasuredHeight();
mViewWidth = getMeasuredWidth();
// 按照View的高度计算字体大小
mMaxTextSize = mViewHeight / 7f;
mMinTextSize = mMaxTextSize / 2.2f;
isInit = true;
invalidate();
}
private void init() {
timer = new Timer();
mDataList = new ArrayList<String>();
//第一个paint
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Style.FILL);
mPaint.setTextAlign(Align.CENTER);
//设置选中的字体颜色
mPaint.setColor(getResources().getColor(R.color.color_FF333333));
//第二个paint
nPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
nPaint.setStyle(Style.FILL);
nPaint.setTextAlign(Align.CENTER);
nPaint.setColor(mColorText);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 根据index绘制view
if (isInit) {
drawData(canvas);
}
}
private void drawData(Canvas canvas) {
// 先绘制选中的text再往上往下绘制其余的text
float scale = parabola(mViewHeight / 4.0f, mMoveLen);
float size = (mMaxTextSize - mMinTextSize) * scale + mMinTextSize;
mPaint.setTextSize(size);
mPaint.setAlpha((int) ((mMaxTextAlpha - mMinTextAlpha) * scale + mMinTextAlpha));
// text居中绘制,注意baseline的计算才能达到居中,y值是text中心坐标
float x = (float) (mViewWidth / 2.0);
float y = (float) (mViewHeight / 2.0 + mMoveLen);
FontMetricsInt fmi = mPaint.getFontMetricsInt();
float baseline = (float) (y - (fmi.bottom / 2.0 + fmi.top / 2.0));
canvas.drawText(mDataList.get(mCurrentSelected), x, baseline, mPaint);
// 绘制上方data
for (int i = 1; (mCurrentSelected - i) >= 0; i++) {
drawOtherText(canvas, i, -1);
}
// 绘制下方data
for (int i = 1; (mCurrentSelected + i) < mDataList.size(); i++) {
drawOtherText(canvas, i, 1);
}
}
/**
* @param canvas
* @param position 距离mCurrentSelected的差值
* @param type 1表示向下绘制,-1表示向上绘制
*/
private void drawOtherText(Canvas canvas, int position, int type) {
float d = (float) (MARGIN_ALPHA * mMinTextSize * position + type
* mMoveLen);
float scale = parabola(mViewHeight / 4.0f, d);
float size = (mMaxTextSize - mMinTextSize) * scale + mMinTextSize;
nPaint.setTextSize(size);
nPaint.setAlpha((int) ((mMaxTextAlpha - mMinTextAlpha) * scale + mMinTextAlpha));
float y = (float) (mViewHeight / 2.0 + type * d);
FontMetricsInt fmi = nPaint.getFontMetricsInt();
float baseline = (float) (y - (fmi.bottom / 2.0 + fmi.top / 2.0));
canvas.drawText(mDataList.get(mCurrentSelected + type * position),
(float) (mViewWidth / 2.0), baseline, nPaint);
}
/**
* 抛物线
*
* @param zero 零点坐标
* @param x 偏移量
* @return scale
*/
private float parabola(float zero, float x) {
float f = (float) (1 - Math.pow(x / zero, 2));
return f < 0 ? 0 : f;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
doDown(event);
break;
case MotionEvent.ACTION_MOVE:
mMoveLen += (event.getY() - mLastDownY);
if (mMoveLen > MARGIN_ALPHA * mMinTextSize / 2) {
if (!loop && mCurrentSelected == 0) {
mLastDownY = event.getY();
invalidate();
return true;
}
if (!loop) {
mCurrentSelected--;
}
// 往下滑超过离开距离
moveTailToHead();
mMoveLen = mMoveLen - MARGIN_ALPHA * mMinTextSize;
} else if (mMoveLen < -MARGIN_ALPHA * mMinTextSize / 2) {
if (mCurrentSelected == mDataList.size() - 1) {
mLastDownY = event.getY();
invalidate();
return true;
}
if (!loop) {
mCurrentSelected++;
}
// 往上滑超过离开距离
moveHeadToTail();
mMoveLen = mMoveLen + MARGIN_ALPHA * mMinTextSize;
}
mLastDownY = event.getY();
invalidate();
break;
case MotionEvent.ACTION_UP:
doUp(event);
break;
}
return true;
}
private void doDown(MotionEvent event) {
if (mTask != null) {
mTask.cancel();
mTask = null;
}
mLastDownY = event.getY();
}
// private void doMove(MotionEvent event) {
//
// mMoveLen += (event.getY() - mLastDownY);
//
// if (mMoveLen > MARGIN_ALPHA * mMinTextSize / 2) {
// // 往下滑超过离开距离
// moveTailToHead();
// mMoveLen = mMoveLen - MARGIN_ALPHA * mMinTextSize;
// } else if (mMoveLen < -MARGIN_ALPHA * mMinTextSize / 2) {
// // 往上滑超过离开距离
// moveHeadToTail();
// mMoveLen = mMoveLen + MARGIN_ALPHA * mMinTextSize;
// }
//
// mLastDownY = event.getY();
// invalidate();
// }
private void doUp(MotionEvent event) {
// 抬起手后mCurrentSelected的位置由当前位置move到中间选中位置
if (Math.abs(mMoveLen) < 0.0001) {
mMoveLen = 0;
return;
}
if (mTask != null) {
mTask.cancel();
mTask = null;
}
mTask = new MyTimerTask(updateHandler);
timer.schedule(mTask, 0, 10);
}
class MyTimerTask extends TimerTask {
Handler handler;
public MyTimerTask(Handler handler) {
this.handler = handler;
}
@Override
public void run() {
handler.sendMessage(handler.obtainMessage());
}
}
public interface onSelectListener {
void onSelect(String text);
}
public void setCanScroll(boolean canScroll) {
this.canScroll = canScroll;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (canScroll) {
return super.dispatchTouchEvent(event);
} else {
return false;
}
}
/**
* 新增字段 控制内容是否首尾相连
* by liuli
*
* @param isLoop
*/
public void setIsLoop(boolean isLoop) {
loop = isLoop;
}
}
5、dialog_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:padding="10dp">
<TextView
android:id="@+id/tv_cancle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:padding="10dp"
android:text="取消"
android:textColor="@color/color_FFB0B8C7"
android:textSize="@dimen/sp_16" />
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text=""
android:textColor="@color/colorPrimary"
android:textSize="20sp" />
<TextView
android:id="@+id/tv_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:padding="10dp"
android:text="完成"
android:textColor="@color/color_FFF96857"
android:textSize="@dimen/sp_16" />
</RelativeLayout>
<View
android:layout_width="fill_parent"
android:layout_height="@dimen/dp_0_5"
android:background="@color/color_FFE5E5EA"/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:background="#ffffff"
android:orientation="horizontal"
android:paddingBottom="15dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="15dp">
<com.sumansoul.calendardemo.utils.PickerView
android:id="@+id/year_pv"
android:layout_width="0dp"
android:layout_height="160dp"
android:layout_weight="3" />
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="年"
android:textColor="@color/color_FF333333"
android:textSize="18sp" />
<com.sumansoul.calendardemo.utils.PickerView
android:id="@+id/month_pv"
android:layout_width="0dp"
android:layout_height="160dp"
android:layout_weight="2"
app:isLoop="false" />
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="月"
android:textColor="@color/color_FF333333"
android:textSize="18sp" />
<com.sumansoul.calendardemo.utils.PickerView
android:id="@+id/day_pv"
android:layout_width="0dp"
android:layout_height="160dp"
android:layout_weight="2" />
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="日"
android:textColor="@color/color_FF333333"
android:textSize="18sp" />
<com.sumansoul.calendardemo.utils.PickerView
android:id="@+id/hour_pv"
android:layout_width="0dp"
android:layout_height="160dp"
android:layout_weight="2" />
<TextView
android:id="@+id/hour_text"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="时"
android:textColor="@color/color_FF333333"
android:textSize="18sp" />
<com.sumansoul.calendardemo.utils.PickerView
android:id="@+id/minute_pv"
android:layout_width="0dp"
android:layout_height="160dp"
android:layout_weight="2" />
<TextView
android:id="@+id/minute_text"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="分"
android:textColor="@color/color_FF333333"
android:textSize="18sp" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
6、ScreenUtil类
public class ScreenUtil {
public static int height;
public static int width;
private Context context;
private static ScreenUtil instance;
private ScreenUtil(Context context) {
this.context = context;
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(dm);
width = dm.widthPixels;
height = dm.heightPixels;
}
public static ScreenUtil getInstance(Context context) {
if (instance == null) {
instance = new ScreenUtil(context);
}
return instance;
}
/**
* 得到手机屏幕的宽度, pix单位
*/
public int getScreenWidth() {
return width;
}
}
7、TextUtil 类
public class TextUtil {
public static boolean isEmpty(String str) {
if (str == null || "".equals(str) || "null".equalsIgnoreCase(str)) {
return true;
}
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c != ' ' && c != '\t' && c != '\r' && c != '\n') {
return false;
}
}
return true;
}
}
8、DateTimeHelper类
/**
* 时间选择
*/
public class DateTimeHelper {
private static final String DATETIME_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss";
private static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd";
private static final String TIME_FORMAT_PATTERN = "HH:mm:ss";
private static final String DATETIME_MILLSECONDS_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
public DateTimeHelper() {
}
public static String formatDateTime(Date value) {
return format(value, "yyyy-MM-dd HH:mm:ss");
}
public static String formatDate(Date value) {
return format(value, "yyyy-MM-dd");
}
public static String formatTime(Date value) {
return format(value, "HH:mm:ss");
}
public static String formatMillSecondDateTime(Date value) {
return format(value, "yyyy-MM-dd HH:mm:ss.SSS");
}
public static String format(Date value, String formatString) {
if (value == null) {
return "";
} else {
SimpleDateFormat sdf = new SimpleDateFormat(formatString, Locale.getDefault());
return sdf.format(value);
}
}
public static Date parse(String strDate, String pattern) {
if (TextUtil.isEmpty(strDate)) {
return null;
}
try {
SimpleDateFormat df = new SimpleDateFormat(pattern);
return df.parse(strDate);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static int getSecondTimeStamp(Date value) {
long time = value.getTime();
String timestamp = String.valueOf(time / 1000L);
return Integer.valueOf(timestamp);
}
public static long getCurrentTimeStamp() {
return (new Date()).getTime();
}
public static int getCurrentSecondTimeStamp() {
return getSecondTimeStamp(new Date());
}
@SuppressLint("WrongConstant")
public static Date getYesterdayDate() {
Calendar calendar = Calendar.getInstance();
calendar.add(5, -1);
Date yesterday = calendar.getTime();
return yesterday;
}
@SuppressLint("WrongConstant")
public static Date getLastDayOfLastMonth(Integer month, Integer flag) {
Calendar cal = Calendar.getInstance();
cal.add(2, month);
int startDay = cal.getActualMinimum(5);
int endDay = cal.getActualMaximum(5);
if (flag != null && flag >= 0 && flag <= 0) {
cal.set(cal.get(1), cal.get(2), startDay);
} else {
cal.set(cal.get(1), cal.get(2), endDay);
}
return cal.getTime();
}
@SuppressLint("WrongConstant")
public static String getDateOrStampByMonth(Integer month, Integer flag) {
String dateOrStamp = "";
try {
Calendar calendar = Calendar.getInstance();
calendar.add(2, month);
Date yesterday = calendar.getTime();
if (flag != null) {
if (flag == 2) {
dateOrStamp = (new SimpleDateFormat("yyyy-MM-dd")).format(yesterday);
} else {
dateOrStamp = yesterday.getTime() + "";
}
} else {
dateOrStamp = yesterday.getTime() + "";
}
return dateOrStamp;
} catch (Exception var5) {
return "err";
}
}
public static Long dateToStamp(String dateStr) {
Long ts = 0L;
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (dateStr.trim().length() == 10) {
dateStr = dateStr + " 00:00:00";
}
Date date = simpleDateFormat.parse(dateStr);
ts = date.getTime();
return ts;
} catch (Exception var4) {
return 0L;
}
}
@SuppressLint("WrongConstant")
public static Date addDay(int day) {
Calendar calendar = Calendar.getInstance();
calendar.add(5, day);
Date afterAddDate = calendar.getTime();
return afterAddDate;
}
@SuppressLint("WrongConstant")
public static Date addDay(Date startDate, int day) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);
calendar.add(5, day);
Date afterAddDate = calendar.getTime();
return afterAddDate;
}
public static String getYesterdayString() {
Date yesterday = getYesterdayDate();
String yesterdayStr = formatDate(yesterday);
return yesterdayStr;
}
public static String getDateStringByFormat(String format) {
Date date = new Date();
return format(date, format);
}
public static String getCurrentYear() {
Date current = new Date();
return format(current, "yyyy");
}
public static String getCurrentMonth() {
Date current = new Date();
return format(current, "MM");
}
public static String getCurrentDay() {
Date current = new Date();
return format(current, "dd");
}
@SuppressLint("WrongConstant")
public static long getTodayBeginTimeStamp() {
Calendar currentDay = Calendar.getInstance();
currentDay.set(11, 0);
currentDay.set(12, 0);
currentDay.set(13, 0);
currentDay.set(14, 0);
return currentDay.getTime().getTime();
}
@SuppressLint("WrongConstant")
public static long getTodayEndTimeStamp() {
Calendar currentDay = Calendar.getInstance();
currentDay.set(11, 23);
currentDay.set(12, 59);
currentDay.set(13, 59);
currentDay.set(14, 999);
return currentDay.getTime().getTime();
}
public static int getTodayBeginSecondTimeStamp() {
long beginTimeStamp = getTodayBeginTimeStamp();
return (int)(beginTimeStamp / 1000L);
}
public static int getTodayEndSecondTimeStamp() {
long endTimeStamp = getTodayEndTimeStamp();
return (int)(endTimeStamp / 1000L);
}
public static String getYearMonDayPath() {
String pathYear = getCurrentYear() + File.separator;
String pathMon = getCurrentMonth() + File.separator;
String pathDay = getCurrentDay() + File.separator;
String path = pathYear + pathMon + pathDay;
return path;
}
public static Date deFormat(String dateValue, String pattern) {
Date date = new Date(0L);
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
date = dateFormat.parse(dateValue);
} catch (Exception var4) {
}
return date;
}
public static int compare(Date date1, Date date2) {
if (date1 == null) {
return -1;
} else if (date2 == null) {
return 1;
} else if (date1.getTime() > date2.getTime()) {
return 1;
} else {
return date1.getTime() < date2.getTime() ? -1 : 0;
}
}
public static void main(String[] args) {
Date value = new Date();
System.out.println(formatDate(value));
System.out.println(formatDateTime(value));
System.out.println(formatTime(value));
System.out.println(formatMillSecondDateTime(value));
System.out.println(format(value, "yyyyMMdd"));
System.out.println(value.getTime());
System.out.println(0.01D);
System.out.println(getSecondTimeStamp(value));
System.out.println(File.separator);
System.out.println(getYesterdayString());
Date yesterday = getYesterdayDate();
System.out.println("yesterday=" + formatDateTime(yesterday));
System.out.println("CurrentYear=" + getCurrentYear());
System.out.println("CurrentMonth=" + getCurrentMonth());
System.out.println("CurrentDay=" + getCurrentDay());
System.out.println("Today Start TimeStamp=" + getTodayBeginTimeStamp());
System.out.println("Today End TimeStamp=" + getTodayEndTimeStamp());
System.out.println("Today Start SecondTimeStamp=" + getTodayBeginSecondTimeStamp());
System.out.println("Today End SecondTimeStamp=" + getTodayEndSecondTimeStamp());
}
}
9、styles.xml
<declare-styleable name="PickerView"><attr format="boolean" name="isLoop"/></declare-styleable>
<style name="time_dialog" parent="android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@color/color_FF333333</item>
</style>
10、colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#008577</color>
<color name="colorPrimaryDark">#00574B</color>
<color name="colorAccent">#D81B60</color>
<color name="color_FFFFFFFF">#ffffff</color>
<color name="color_FF333333">#333333</color>
<color name="color_FFB0B8C7">#ffB0B8C7</color>
<color name="color_FFF96857">#FFF96857</color>
<!--下划线 -->
<color name="color_FFE5E5EA">#E5E5EA</color>
</resources>
11、dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 布局尺寸,你能在任何地方添加 -->
<dimen name="dp_m_60">-60dp</dimen>
<dimen name="dp_m_30">-30dp</dimen>
<dimen name="dp_m_20">-20dp</dimen>
<dimen name="dp_m_12">-12dp</dimen>
<dimen name="dp_m_10">-10dp</dimen>
<dimen name="dp_m_8">-8dp</dimen>
<dimen name="dp_m_5">-5dp</dimen>
<dimen name="dp_m_2">-2dp</dimen>
<dimen name="dp_m_1">-1dp</dimen>
<dimen name="dp_0">0dp</dimen>
<dimen name="dp_0_1">0.1dp</dimen>
<dimen name="dp_0_3">0.3dp</dimen>
<dimen name="dp_0_5">0.5dp</dimen>
<dimen name="dp_1">1dp</dimen>
<dimen name="dp_1_5">1.5dp</dimen>
<dimen name="dp_2">2dp</dimen>
<dimen name="dp_2_5">2.5dp</dimen>
<dimen name="dp_3">3dp</dimen>
<dimen name="dp_3_5">3.5dp</dimen>
<dimen name="dp_4">4dp</dimen>
<dimen name="dp_4_5">4.5dp</dimen>
<dimen name="dp_5">5dp</dimen>
<dimen name="dp_6">6dp</dimen>
<dimen name="dp_7">7dp</dimen>
<dimen name="dp_7_5">7.5dp</dimen>
<dimen name="dp_8">8dp</dimen>
<dimen name="dp_9">9dp</dimen>
<dimen name="dp_10">10dp</dimen>
<dimen name="dp_11">11dp</dimen>
<dimen name="dp_12">12dp</dimen>
<dimen name="dp_13">13dp</dimen>
<dimen name="dp_14">14dp</dimen>
<dimen name="dp_15">15dp</dimen>
<dimen name="dp_16">16dp</dimen>
<dimen name="dp_17">17dp</dimen>
<dimen name="dp_18">18dp</dimen>
<dimen name="dp_19">19dp</dimen>
<dimen name="dp_20">20dp</dimen>
<dimen name="dp_21">21dp</dimen>
<dimen name="dp_22">22dp</dimen>
<dimen name="dp_23">23dp</dimen>
<dimen name="dp_24">24dp</dimen>
<dimen name="dp_25">25dp</dimen>
<dimen name="dp_26">26dp</dimen>
<dimen name="dp_27">27dp</dimen>
<dimen name="dp_28">28dp</dimen>
<dimen name="dp_29">29dp</dimen>
<dimen name="dp_30">30dp</dimen>
<dimen name="dp_31">31dp</dimen>
<dimen name="dp_32">32dp</dimen>
<dimen name="dp_33">33dp</dimen>
<dimen name="dp_34">34dp</dimen>
<dimen name="dp_35">35dp</dimen>
<dimen name="dp_36">36dp</dimen>
<dimen name="dp_37">37dp</dimen>
<dimen name="dp_38">38dp</dimen>
<dimen name="dp_39">39dp</dimen>
<dimen name="dp_40">40dp</dimen>
<dimen name="dp_41">41dp</dimen>
<dimen name="dp_42">42dp</dimen>
<dimen name="dp_43">43dp</dimen>
<dimen name="dp_44">44dp</dimen>
<dimen name="dp_45">45dp</dimen>
<dimen name="dp_46">46dp</dimen>
<dimen name="dp_47">47dp</dimen>
<dimen name="dp_48">48dp</dimen>
<dimen name="dp_49">49dp</dimen>
<dimen name="dp_50">50dp</dimen>
<dimen name="dp_51">51dp</dimen>
<dimen name="dp_52">52dp</dimen>
<dimen name="dp_53">53dp</dimen>
<dimen name="dp_54">54dp</dimen>
<dimen name="dp_55">55dp</dimen>
<dimen name="dp_56">56dp</dimen>
<dimen name="dp_57">57dp</dimen>
<dimen name="dp_58">58dp</dimen>
<dimen name="dp_59">59dp</dimen>
<dimen name="dp_60">60dp</dimen>
<dimen name="dp_61">61dp</dimen>
<dimen name="dp_62">62dp</dimen>
<dimen name="dp_63">63dp</dimen>
<dimen name="dp_64">64dp</dimen>
<dimen name="dp_65">65dp</dimen>
<dimen name="dp_66">66dp</dimen>
<dimen name="dp_67">67dp</dimen>
<dimen name="dp_68">68dp</dimen>
<dimen name="dp_69">69dp</dimen>
<dimen name="dp_70">70dp</dimen>
<dimen name="dp_71">71dp</dimen>
<dimen name="dp_72">72dp</dimen>
<dimen name="dp_73">73dp</dimen>
<dimen name="dp_74">74dp</dimen>
<dimen name="dp_75">75dp</dimen>
<dimen name="dp_76">76dp</dimen>
<dimen name="dp_77">77dp</dimen>
<dimen name="dp_78">78dp</dimen>
<dimen name="dp_79">79dp</dimen>
<dimen name="dp_80">80dp</dimen>
<dimen name="dp_81">81dp</dimen>
<dimen name="dp_82">82dp</dimen>
<dimen name="dp_83">83dp</dimen>
<dimen name="dp_84">84dp</dimen>
<dimen name="dp_85">85dp</dimen>
<dimen name="dp_86">86dp</dimen>
<dimen name="dp_87">87dp</dimen>
<dimen name="dp_88">88dp</dimen>
<dimen name="dp_89">89dp</dimen>
<dimen name="dp_90">90dp</dimen>
<dimen name="dp_91">91dp</dimen>
<dimen name="dp_92">92dp</dimen>
<dimen name="dp_93">93dp</dimen>
<dimen name="dp_94">94dp</dimen>
<dimen name="dp_95">95dp</dimen>
<dimen name="dp_96">96dp</dimen>
<dimen name="dp_97">97dp</dimen>
<dimen name="dp_98">98dp</dimen>
<dimen name="dp_99">99dp</dimen>
<dimen name="dp_100">100dp</dimen>
<dimen name="dp_101">101dp</dimen>
<dimen name="dp_102">102dp</dimen>
<dimen name="dp_103">103dp</dimen>
<dimen name="dp_104">104dp</dimen>
<dimen name="dp_105">105dp</dimen>
<dimen name="dp_106">106dp</dimen>
<dimen name="dp_107">107dp</dimen>
<dimen name="dp_108">108dp</dimen>
<dimen name="dp_109">109dp</dimen>
<dimen name="dp_110">110dp</dimen>
<dimen name="dp_111">111dp</dimen>
<dimen name="dp_112">112dp</dimen>
<dimen name="dp_113">113dp</dimen>
<dimen name="dp_114">114dp</dimen>
<dimen name="dp_115">115dp</dimen>
<dimen name="dp_116">116dp</dimen>
<dimen name="dp_117">117dp</dimen>
<dimen name="dp_118">118dp</dimen>
<dimen name="dp_119">119dp</dimen>
<dimen name="dp_120">120dp</dimen>
<dimen name="dp_121">121dp</dimen>
<dimen name="dp_122">122dp</dimen>
<dimen name="dp_123">123dp</dimen>
<dimen name="dp_124">124dp</dimen>
<dimen name="dp_125">125dp</dimen>
<dimen name="dp_126">126dp</dimen>
<dimen name="dp_127">127dp</dimen>
<dimen name="dp_128">128dp</dimen>
<dimen name="dp_129">129dp</dimen>
<dimen name="dp_130">130dp</dimen>
<dimen name="dp_131">131dp</dimen>
<dimen name="dp_132">132dp</dimen>
<dimen name="dp_133">133dp</dimen>
<dimen name="dp_134">134dp</dimen>
<dimen name="dp_135">135dp</dimen>
<dimen name="dp_136">136dp</dimen>
<dimen name="dp_137">137dp</dimen>
<dimen name="dp_138">138dp</dimen>
<dimen name="dp_139">139dp</dimen>
<dimen name="dp_140">140dp</dimen>
<dimen name="dp_141">141dp</dimen>
<dimen name="dp_142">142dp</dimen>
<dimen name="dp_143">143dp</dimen>
<dimen name="dp_144">144dp</dimen>
<dimen name="dp_145">145dp</dimen>
<dimen name="dp_146">146dp</dimen>
<dimen name="dp_147">147dp</dimen>
<dimen name="dp_148">148dp</dimen>
<dimen name="dp_149">149dp</dimen>
<dimen name="dp_150">150dp</dimen>
<dimen name="dp_151">151dp</dimen>
<dimen name="dp_152">152dp</dimen>
<dimen name="dp_153">153dp</dimen>
<dimen name="dp_154">154dp</dimen>
<dimen name="dp_155">155dp</dimen>
<dimen name="dp_156">156dp</dimen>
<dimen name="dp_157">157dp</dimen>
<dimen name="dp_158">158dp</dimen>
<dimen name="dp_159">159dp</dimen>
<dimen name="dp_160">160dp</dimen>
<dimen name="dp_161">161dp</dimen>
<dimen name="dp_162">162dp</dimen>
<dimen name="dp_163">163dp</dimen>
<dimen name="dp_164">164dp</dimen>
<dimen name="dp_165">165dp</dimen>
<dimen name="dp_166">166dp</dimen>
<dimen name="dp_167">167dp</dimen>
<dimen name="dp_168">168dp</dimen>
<dimen name="dp_169">169dp</dimen>
<dimen name="dp_170">170dp</dimen>
<dimen name="dp_171">171dp</dimen>
<dimen name="dp_172">172dp</dimen>
<dimen name="dp_173">173dp</dimen>
<dimen name="dp_174">174dp</dimen>
<dimen name="dp_175">175dp</dimen>
<dimen name="dp_176">176dp</dimen>
<dimen name="dp_177">177dp</dimen>
<dimen name="dp_178">178dp</dimen>
<dimen name="dp_179">179dp</dimen>
<dimen name="dp_180">180dp</dimen>
<dimen name="dp_181">181dp</dimen>
<dimen name="dp_182">182dp</dimen>
<dimen name="dp_183">183dp</dimen>
<dimen name="dp_184">184dp</dimen>
<dimen name="dp_185">185dp</dimen>
<dimen name="dp_186">186dp</dimen>
<dimen name="dp_187">187dp</dimen>
<dimen name="dp_188">188dp</dimen>
<dimen name="dp_189">189dp</dimen>
<dimen name="dp_190">190dp</dimen>
<dimen name="dp_191">191dp</dimen>
<dimen name="dp_192">192dp</dimen>
<dimen name="dp_193">193dp</dimen>
<dimen name="dp_194">194dp</dimen>
<dimen name="dp_195">195dp</dimen>
<dimen name="dp_196">196dp</dimen>
<dimen name="dp_197">197dp</dimen>
<dimen name="dp_198">198dp</dimen>
<dimen name="dp_199">199dp</dimen>
<dimen name="dp_200">200dp</dimen>
<dimen name="dp_201">201dp</dimen>
<dimen name="dp_202">202dp</dimen>
<dimen name="dp_203">203dp</dimen>
<dimen name="dp_204">204dp</dimen>
<dimen name="dp_205">205dp</dimen>
<dimen name="dp_206">206dp</dimen>
<dimen name="dp_207">207dp</dimen>
<dimen name="dp_208">208dp</dimen>
<dimen name="dp_209">209dp</dimen>
<dimen name="dp_210">210dp</dimen>
<dimen name="dp_211">211dp</dimen>
<dimen name="dp_212">212dp</dimen>
<dimen name="dp_213">213dp</dimen>
<dimen name="dp_214">214dp</dimen>
<dimen name="dp_215">215dp</dimen>
<dimen name="dp_216">216dp</dimen>
<dimen name="dp_217">217dp</dimen>
<dimen name="dp_218">218dp</dimen>
<dimen name="dp_219">219dp</dimen>
<dimen name="dp_220">220dp</dimen>
<dimen name="dp_221">221dp</dimen>
<dimen name="dp_222">222dp</dimen>
<dimen name="dp_223">223dp</dimen>
<dimen name="dp_224">224dp</dimen>
<dimen name="dp_225">225dp</dimen>
<dimen name="dp_226">226dp</dimen>
<dimen name="dp_227">227dp</dimen>
<dimen name="dp_228">228dp</dimen>
<dimen name="dp_229">229dp</dimen>
<dimen name="dp_230">230dp</dimen>
<dimen name="dp_231">231dp</dimen>
<dimen name="dp_232">232dp</dimen>
<dimen name="dp_233">233dp</dimen>
<dimen name="dp_234">234dp</dimen>
<dimen name="dp_235">235dp</dimen>
<dimen name="dp_236">236dp</dimen>
<dimen name="dp_237">237dp</dimen>
<dimen name="dp_238">238dp</dimen>
<dimen name="dp_239">239dp</dimen>
<dimen name="dp_240">240dp</dimen>
<dimen name="dp_241">241dp</dimen>
<dimen name="dp_242">242dp</dimen>
<dimen name="dp_243">243dp</dimen>
<dimen name="dp_244">244dp</dimen>
<dimen name="dp_245">245dp</dimen>
<dimen name="dp_246">246dp</dimen>
<dimen name="dp_247">247dp</dimen>
<dimen name="dp_248">248dp</dimen>
<dimen name="dp_249">249dp</dimen>
<dimen name="dp_250">250dp</dimen>
<dimen name="dp_251">251dp</dimen>
<dimen name="dp_252">252dp</dimen>
<dimen name="dp_253">253dp</dimen>
<dimen name="dp_254">254dp</dimen>
<dimen name="dp_255">255dp</dimen>
<dimen name="dp_256">256dp</dimen>
<dimen name="dp_257">257dp</dimen>
<dimen name="dp_258">258dp</dimen>
<dimen name="dp_259">259dp</dimen>
<dimen name="dp_260">260dp</dimen>
<dimen name="dp_261">261dp</dimen>
<dimen name="dp_262">262dp</dimen>
<dimen name="dp_263">263dp</dimen>
<dimen name="dp_264">264dp</dimen>
<dimen name="dp_265">265dp</dimen>
<dimen name="dp_266">266dp</dimen>
<dimen name="dp_267">267dp</dimen>
<dimen name="dp_268">268dp</dimen>
<dimen name="dp_269">269dp</dimen>
<dimen name="dp_270">270dp</dimen>
<dimen name="dp_271">271dp</dimen>
<dimen name="dp_272">272dp</dimen>
<dimen name="dp_273">273dp</dimen>
<dimen name="dp_274">274dp</dimen>
<dimen name="dp_275">275dp</dimen>
<dimen name="dp_276">276dp</dimen>
<dimen name="dp_277">277dp</dimen>
<dimen name="dp_278">278dp</dimen>
<dimen name="dp_279">279dp</dimen>
<dimen name="dp_280">280dp</dimen>
<dimen name="dp_281">281dp</dimen>
<dimen name="dp_282">282dp</dimen>
<dimen name="dp_283">283dp</dimen>
<dimen name="dp_284">284dp</dimen>
<dimen name="dp_285">285dp</dimen>
<dimen name="dp_286">286dp</dimen>
<dimen name="dp_287">287dp</dimen>
<dimen name="dp_288">288dp</dimen>
<dimen name="dp_289">289dp</dimen>
<dimen name="dp_290">290dp</dimen>
<dimen name="dp_291">291dp</dimen>
<dimen name="dp_292">292dp</dimen>
<dimen name="dp_293">293dp</dimen>
<dimen name="dp_294">294dp</dimen>
<dimen name="dp_295">295dp</dimen>
<dimen name="dp_296">296dp</dimen>
<dimen name="dp_297">297dp</dimen>
<dimen name="dp_298">298dp</dimen>
<dimen name="dp_299">299dp</dimen>
<dimen name="dp_300">300dp</dimen>
<dimen name="dp_301">301dp</dimen>
<dimen name="dp_302">302dp</dimen>
<dimen name="dp_303">303dp</dimen>
<dimen name="dp_304">304dp</dimen>
<dimen name="dp_305">305dp</dimen>
<dimen name="dp_306">306dp</dimen>
<dimen name="dp_307">307dp</dimen>
<dimen name="dp_308">308dp</dimen>
<dimen name="dp_309">309dp</dimen>
<dimen name="dp_310">310dp</dimen>
<dimen name="dp_311">311dp</dimen>
<dimen name="dp_312">312dp</dimen>
<dimen name="dp_313">313dp</dimen>
<dimen name="dp_314">314dp</dimen>
<dimen name="dp_315">315dp</dimen>
<dimen name="dp_316">316dp</dimen>
<dimen name="dp_317">317dp</dimen>
<dimen name="dp_318">318dp</dimen>
<dimen name="dp_319">319dp</dimen>
<dimen name="dp_320">320dp</dimen>
<dimen name="dp_321">321dp</dimen>
<dimen name="dp_322">322dp</dimen>
<dimen name="dp_323">323dp</dimen>
<dimen name="dp_324">324dp</dimen>
<dimen name="dp_325">325dp</dimen>
<dimen name="dp_326">326dp</dimen>
<dimen name="dp_327">327dp</dimen>
<dimen name="dp_328">328dp</dimen>
<dimen name="dp_329">329dp</dimen>
<dimen name="dp_330">330dp</dimen>
<dimen name="dp_331">331dp</dimen>
<dimen name="dp_332">332dp</dimen>
<dimen name="dp_333">333dp</dimen>
<dimen name="dp_334">334dp</dimen>
<dimen name="dp_335">335dp</dimen>
<dimen name="dp_336">336dp</dimen>
<dimen name="dp_337">337dp</dimen>
<dimen name="dp_338">338dp</dimen>
<dimen name="dp_339">339dp</dimen>
<dimen name="dp_340">340dp</dimen>
<dimen name="dp_341">341dp</dimen>
<dimen name="dp_342">342dp</dimen>
<dimen name="dp_343">343dp</dimen>
<dimen name="dp_344">344dp</dimen>
<dimen name="dp_345">345dp</dimen>
<dimen name="dp_346">346dp</dimen>
<dimen name="dp_347">347dp</dimen>
<dimen name="dp_348">348dp</dimen>
<dimen name="dp_349">349dp</dimen>
<dimen name="dp_350">350dp</dimen>
<dimen name="dp_351">351dp</dimen>
<dimen name="dp_352">352dp</dimen>
<dimen name="dp_353">353dp</dimen>
<dimen name="dp_354">354dp</dimen>
<dimen name="dp_355">355dp</dimen>
<dimen name="dp_356">356dp</dimen>
<dimen name="dp_357">357dp</dimen>
<dimen name="dp_358">358dp</dimen>
<dimen name="dp_359">359dp</dimen>
<dimen name="dp_360">360dp</dimen>
<dimen name="dp_365">365dp</dimen>
<dimen name="dp_370">370dp</dimen>
<dimen name="dp_375">375dp</dimen>
<dimen name="dp_400">400dp</dimen>
<dimen name="dp_410">410dp</dimen>
<dimen name="dp_422">422dp</dimen>
<dimen name="dp_430">422dp</dimen>
<dimen name="dp_440">440dp</dimen>
<dimen name="dp_450">450dp</dimen>
<dimen name="dp_472">472dp</dimen>
<dimen name="dp_480">480dp</dimen>
<dimen name="dp_500">500dp</dimen>
<dimen name="dp_520">520dp</dimen>
<dimen name="dp_600">600dp</dimen>
<dimen name="dp_640">640dp</dimen>
<dimen name="dp_720">720dp</dimen>
<dimen name="dp_742">742dp</dimen>
<dimen name="dp_1000">1000dp</dimen>
<!-- 字体尺寸,你可以在任何地方添加-->
<dimen name="sp_1">1sp</dimen>
<dimen name="sp_2">2sp</dimen>
<dimen name="sp_3">3sp</dimen>
<dimen name="sp_4">4sp</dimen>
<dimen name="sp_5">5sp</dimen>
<dimen name="sp_6">6sp</dimen>
<dimen name="sp_7">7sp</dimen>
<dimen name="sp_8">8sp</dimen>
<dimen name="sp_9">9sp</dimen>
<dimen name="sp_10">10sp</dimen>
<dimen name="sp_11">11sp</dimen>
<dimen name="sp_12">12sp</dimen>
<dimen name="sp_13">13sp</dimen>
<dimen name="sp_14">14sp</dimen>
<dimen name="sp_15">15sp</dimen>
<dimen name="sp_16">16sp</dimen>
<dimen name="sp_17">17sp</dimen>
<dimen name="sp_18">18sp</dimen>
<dimen name="sp_19">19sp</dimen>
<dimen name="sp_20">20sp</dimen>
<dimen name="sp_21">21sp</dimen>
<dimen name="sp_22">22sp</dimen>
<dimen name="sp_23">23sp</dimen>
<dimen name="sp_24">24sp</dimen>
<dimen name="sp_25">25sp</dimen>
<dimen name="sp_28">28sp</dimen>
<dimen name="sp_30">30sp</dimen>
<dimen name="sp_32">32sp</dimen>
<dimen name="sp_34">34sp</dimen>
<dimen name="sp_36">36sp</dimen>
<dimen name="sp_38">38sp</dimen>
<dimen name="sp_40">40sp</dimen>
<dimen name="sp_42">42sp</dimen>
<dimen name="sp_48">48sp</dimen>
<dimen name="_sp_50">-50sp</dimen>
</resources>
网友评论