package com.bigkoo.pickerview.view; import android.view.View; import com.bigkoo.pickerview.R; import com.bigkoo.pickerview.adapter.NumericWheelAdapter; import com.bigkoo.pickerview.lib.WheelView; import com.bigkoo.pickerview.listener.OnItemSelectedListener; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; import java.util.List; public class WheelTime { public static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private View view; private WheelView wv_year; private WheelView wv_month; private WheelView wv_day; private WheelView wv_hours; private WheelView wv_mins; private WheelView wv_seconds; private int gravity; private boolean[] type; private static final int DEFAULT_START_YEAR = 1900; private static final int DEFAULT_END_YEAR = 2100; private static final int DEFAULT_START_MONTH = 1; private static final int DEFAULT_END_MONTH = 12; private static final int DEFAULT_START_DAY = 1; private static final int DEFAULT_END_DAY = 31; private int startYear = DEFAULT_START_YEAR; private int endYear = DEFAULT_END_YEAR; private int startMonth = DEFAULT_START_MONTH; private int endMonth = DEFAULT_END_MONTH; private int startDay = DEFAULT_START_DAY; private int endDay = DEFAULT_END_DAY; //表示31天的 private int currentYear; // 根据屏幕密度来指定选择器字体的大小(不同屏幕可能不同) private int textSize = 18; //文字的颜色和分割线的颜色 int textColorOut; int textColorCenter; int dividerColor; // 条目间距倍数 float lineSpacingMultiplier = 1.6F; private WheelView.DividerType dividerType; public WheelTime(View view) { super(); this.view = view; type = new boolean[]{true, true, true, true, true, true}; setView(view); } public WheelTime(View view, boolean[] type, int gravity, int textSize) { super(); this.view = view; this.type = type; this.gravity = gravity; this.textSize = textSize; setView(view); } public void setPicker(int year, int month, int day) { this.setPicker(year, month, day, 0, 0, 0); } public void setPicker(int year, final int month, int day, int h, int m, int s) { // 添加大小月月份并将其转换为list,方便之后的判断 String[] months_big = {"1", "3", "5", "7", "8", "10", "12"}; String[] months_little = {"4", "6", "9", "11"}; final List<String> list_big = Arrays.asList(months_big); final List<String> list_little = Arrays.asList(months_little); /* final Context context = view.getContext();*/ currentYear = year; // 年 wv_year = (WheelView) view.findViewById(R.id.year); wv_year.setAdapter(new NumericWheelAdapter(startYear, endYear));// 设置"年"的显示数据 /*wv_year.setLabel(context.getString(R.string.pickerview_year));// 添加文字*/ wv_year.setCurrentItem(year - startYear);// 初始化时显示的数据 wv_year.setGravity(gravity); // 月 wv_month = (WheelView) view.findViewById(R.id.month); if (startYear == endYear) {//开始年等于终止年 wv_month.setAdapter(new NumericWheelAdapter(startMonth, endMonth)); wv_month.setCurrentItem(month + 1 - startMonth); } else if (year == startYear) { //起始日期的月份控制 wv_month.setAdapter(new NumericWheelAdapter(startMonth, 12)); wv_month.setCurrentItem(month + 1 - startMonth); } else if (year == endYear) { //终止日期的月份控制 wv_month.setAdapter(new NumericWheelAdapter(1, endMonth)); wv_month.setCurrentItem(month); } else { wv_month.setAdapter(new NumericWheelAdapter(1, 12)); wv_month.setCurrentItem(month); } /* wv_month.setLabel(context.getString(R.string.pickerview_month));*/ wv_month.setGravity(gravity); // 日 wv_day = (WheelView) view.findViewById(R.id.day); if (startYear == endYear && startMonth == endMonth) { if (list_big.contains(String.valueOf(month + 1))) { if (endDay > 31) { endDay = 31; } wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay)); } else if (list_little.contains(String.valueOf(month + 1))) { if (endDay > 30) { endDay = 30; } wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay)); } else { // 闰年 if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { if (endDay > 29) { endDay = 29; } wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay)); } else { if (endDay > 28) { endDay = 28; } wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay)); } } wv_day.setCurrentItem(day - startDay); } else if (year == startYear && month + 1 == startMonth) { // 起始日期的天数控制 if (list_big.contains(String.valueOf(month + 1))) { wv_day.setAdapter(new NumericWheelAdapter(startDay, 31)); } else if (list_little.contains(String.valueOf(month + 1))) { wv_day.setAdapter(new NumericWheelAdapter(startDay, 30)); } else { // 闰年 if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { wv_day.setAdapter(new NumericWheelAdapter(startDay, 29)); } else { wv_day.setAdapter(new NumericWheelAdapter(startDay, 28)); } } wv_day.setCurrentItem(day - startDay); } else if (year == endYear && month + 1 == endMonth) { // 终止日期的天数控制 if (list_big.contains(String.valueOf(month + 1))) { if (endDay > 31) { endDay = 31; } wv_day.setAdapter(new NumericWheelAdapter(1, endDay)); } else if (list_little.contains(String.valueOf(month + 1))) { if (endDay > 30) { endDay = 30; } wv_day.setAdapter(new NumericWheelAdapter(1, endDay)); } else { // 闰年 if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { if (endDay > 29) { endDay = 29; } wv_day.setAdapter(new NumericWheelAdapter(1, endDay)); } else { if (endDay > 28) { endDay = 28; } wv_day.setAdapter(new NumericWheelAdapter(1, endDay)); } } wv_day.setCurrentItem(day - 1); } else { // 判断大小月及是否闰年,用来确定"日"的数据 if (list_big.contains(String.valueOf(month + 1))) { wv_day.setAdapter(new NumericWheelAdapter(1, 31)); } else if (list_little.contains(String.valueOf(month + 1))) { wv_day.setAdapter(new NumericWheelAdapter(1, 30)); } else { // 闰年 if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { wv_day.setAdapter(new NumericWheelAdapter(1, 29)); } else { wv_day.setAdapter(new NumericWheelAdapter(1, 28)); } } wv_day.setCurrentItem(day - 1); } /* wv_day.setLabel(context.getString(R.string.pickerview_day));*/ wv_day.setGravity(gravity); //时 wv_hours = (WheelView) view.findViewById(R.id.hour); wv_hours.setAdapter(new NumericWheelAdapter(0, 23)); /* wv_hours.setLabel(context.getString(R.string.pickerview_hours));// 添加文字*/ wv_hours.setCurrentItem(h); wv_hours.setGravity(gravity); //分 wv_mins = (WheelView) view.findViewById(R.id.min); wv_mins.setAdapter(new NumericWheelAdapter(0, 59)); /* wv_mins.setLabel(context.getString(R.string.pickerview_minutes));// 添加文字*/ wv_mins.setCurrentItem(m); wv_mins.setGravity(gravity); //秒 wv_seconds = (WheelView) view.findViewById(R.id.second); wv_seconds.setAdapter(new NumericWheelAdapter(0, 59)); /* wv_seconds.setLabel(context.getString(R.string.pickerview_seconds));// 添加文字*/ wv_seconds.setCurrentItem(s); wv_seconds.setGravity(gravity); // 添加"年"监听 OnItemSelectedListener wheelListener_year = new OnItemSelectedListener() { @Override public void onItemSelected(int index) { int year_num = index + startYear; currentYear = year_num; int currentMonthItem = wv_month.getCurrentItem();//记录上一次的item位置 // 判断大小月及是否闰年,用来确定"日"的数据 if (startYear == endYear) { //重新设置月份 wv_month.setAdapter(new NumericWheelAdapter(startMonth, endMonth)); if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) { currentMonthItem = wv_month.getAdapter().getItemsCount() - 1; wv_month.setCurrentItem(currentMonthItem); } int monthNum = currentMonthItem + startMonth; if (startMonth == endMonth) { //重新设置日 setReDay(year_num, monthNum, startDay, endDay, list_big, list_little); } else if (monthNum == startMonth) { //重新设置日 setReDay(year_num, monthNum, startDay, 31, list_big, list_little); } else { //重新设置日 setReDay(year_num, monthNum, 1, 31, list_big, list_little); } } else if (year_num == startYear) {//等于开始的年 //重新设置月份 wv_month.setAdapter(new NumericWheelAdapter(startMonth, 12)); if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) { currentMonthItem = wv_month.getAdapter().getItemsCount() - 1; wv_month.setCurrentItem(currentMonthItem); } int month = currentMonthItem + startMonth; if (month == startMonth) { //重新设置日 setReDay(year_num, month, startDay, 31, list_big, list_little); } else { //重新设置日 setReDay(year_num, month, 1, 31, list_big, list_little); } } else if (year_num == endYear) { //重新设置月份 wv_month.setAdapter(new NumericWheelAdapter(1, endMonth)); if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) { currentMonthItem = wv_month.getAdapter().getItemsCount() - 1; wv_month.setCurrentItem(currentMonthItem); } int monthNum = currentMonthItem + 1; if (monthNum == endMonth) { //重新设置日 setReDay(year_num, monthNum, 1, endDay, list_big, list_little); } else { //重新设置日 setReDay(year_num, monthNum, 1, 31, list_big, list_little); } } else { //重新设置月份 wv_month.setAdapter(new NumericWheelAdapter(1, 12)); //重新设置日 setReDay(year_num, wv_month.getCurrentItem() + 1, 1, 31, list_big, list_little); } } }; // 添加"月"监听 OnItemSelectedListener wheelListener_month = new OnItemSelectedListener() { @Override public void onItemSelected(int index) { int month_num = index + 1; if (startYear == endYear) { month_num = month_num + startMonth - 1; if (startMonth == endMonth) { //重新设置日 setReDay(currentYear, month_num, startDay, endDay, list_big, list_little); } else if (startMonth == month_num) { //重新设置日 setReDay(currentYear, month_num, startDay, 31, list_big, list_little); } else if (endMonth == month_num) { setReDay(currentYear, month_num, 1, endDay, list_big, list_little); } else { setReDay(currentYear, month_num, 1, 31, list_big, list_little); } } else if (currentYear == startYear) { month_num = month_num + startMonth - 1; if (month_num == startMonth) { //重新设置日 setReDay(currentYear, month_num, startDay, 31, list_big, list_little); } else { //重新设置日 setReDay(currentYear, month_num, 1, 31, list_big, list_little); } } else if (currentYear == endYear) { if (month_num == endMonth) { //重新设置日 setReDay(currentYear, wv_month.getCurrentItem() + 1, 1, endDay, list_big, list_little); } else { setReDay(currentYear, wv_month.getCurrentItem() + 1, 1, 31, list_big, list_little); } } else { //重新设置日 setReDay(currentYear, month_num, 1, 31, list_big, list_little); } } }; wv_year.setOnItemSelectedListener(wheelListener_year); wv_month.setOnItemSelectedListener(wheelListener_month); if (type.length != 6) { throw new RuntimeException("type[] length is not 6"); } wv_year.setVisibility(type[0] ? View.VISIBLE : View.GONE); wv_month.setVisibility(type[1] ? View.VISIBLE : View.GONE); wv_day.setVisibility(type[2] ? View.VISIBLE : View.GONE); wv_hours.setVisibility(type[3] ? View.VISIBLE : View.GONE); wv_mins.setVisibility(type[4] ? View.VISIBLE : View.GONE); wv_seconds.setVisibility(type[5] ? View.VISIBLE : View.GONE); setContentTextSize(); } private void setReDay(int year_num, int monthNum, int startD, int endD, List<String> list_big, List<String> list_little) { int currentItem = wv_day.getCurrentItem(); int maxItem; if (list_big .contains(String.valueOf(monthNum))) { if (endD > 31) { endD = 31; } wv_day.setAdapter(new NumericWheelAdapter(startD, endD)); maxItem = endD; } else if (list_little.contains(String.valueOf(monthNum))) { if (endD > 30) { endD = 30; } wv_day.setAdapter(new NumericWheelAdapter(startD, endD)); maxItem = endD; } else { if ((year_num % 4 == 0 && year_num % 100 != 0) || year_num % 400 == 0) { if (endD > 29) { endD = 29; } wv_day.setAdapter(new NumericWheelAdapter(startD, endD)); maxItem = endD; } else { if (endD > 28) { endD = 28; } wv_day.setAdapter(new NumericWheelAdapter(startD, endD)); maxItem = endD; } } if (currentItem > wv_day.getAdapter().getItemsCount() - 1) { currentItem = wv_day.getAdapter().getItemsCount() - 1; wv_day.setCurrentItem(currentItem); } } private void setContentTextSize() { wv_day.setTextSize(textSize); wv_month.setTextSize(textSize); wv_year.setTextSize(textSize); wv_hours.setTextSize(textSize); wv_mins.setTextSize(textSize); wv_seconds.setTextSize(textSize); } private void setTextColorOut() { wv_day.setTextColorOut(textColorOut); wv_month.setTextColorOut(textColorOut); wv_year.setTextColorOut(textColorOut); wv_hours.setTextColorOut(textColorOut); wv_mins.setTextColorOut(textColorOut); wv_seconds.setTextColorOut(textColorOut); } private void setTextColorCenter() { wv_day.setTextColorCenter(textColorCenter); wv_month.setTextColorCenter(textColorCenter); wv_year.setTextColorCenter(textColorCenter); wv_hours.setTextColorCenter(textColorCenter); wv_mins.setTextColorCenter(textColorCenter); wv_seconds.setTextColorCenter(textColorCenter); } private void setDividerColor() { wv_day.setDividerColor(dividerColor); wv_month.setDividerColor(dividerColor); wv_year.setDividerColor(dividerColor); wv_hours.setDividerColor(dividerColor); wv_mins.setDividerColor(dividerColor); wv_seconds.setDividerColor(dividerColor); } private void setDividerType() { wv_day.setDividerType(dividerType); wv_month.setDividerType(dividerType); wv_year.setDividerType(dividerType); wv_hours.setDividerType(dividerType); wv_mins.setDividerType(dividerType); wv_seconds.setDividerType(dividerType); } private void setLineSpacingMultiplier() { wv_day.setLineSpacingMultiplier(lineSpacingMultiplier); wv_month.setLineSpacingMultiplier(lineSpacingMultiplier); wv_year.setLineSpacingMultiplier(lineSpacingMultiplier); wv_hours.setLineSpacingMultiplier(lineSpacingMultiplier); wv_mins.setLineSpacingMultiplier(lineSpacingMultiplier); wv_seconds.setLineSpacingMultiplier(lineSpacingMultiplier); } public void setLabels(String label_year, String label_month, String label_day, String label_hours, String label_mins, String label_seconds) { if (label_year != null) { wv_year.setLabel(label_year); } else { wv_year.setLabel(view.getContext().getString(R.string.pickerview_year)); } if (label_month != null) { wv_month.setLabel(label_month); } else { wv_month.setLabel(view.getContext().getString(R.string.pickerview_month)); } if (label_day != null) { wv_day.setLabel(label_day); } else { wv_day.setLabel(view.getContext().getString(R.string.pickerview_day)); } if (label_hours != null) { wv_hours.setLabel(label_hours); } else { wv_hours.setLabel(view.getContext().getString(R.string.pickerview_hours)); } if (label_mins != null) { wv_mins.setLabel(label_mins); } else { wv_mins.setLabel(view.getContext().getString(R.string.pickerview_minutes)); } if (label_seconds != null) { wv_seconds.setLabel(label_seconds); } else { wv_seconds.setLabel(view.getContext().getString(R.string.pickerview_seconds)); } } /** * 设置是否循环滚动 * * @param cyclic */ public void setCyclic(boolean cyclic) { wv_year.setCyclic(cyclic); wv_month.setCyclic(cyclic); wv_day.setCyclic(cyclic); wv_hours.setCyclic(cyclic); wv_mins.setCyclic(cyclic); wv_seconds.setCyclic(cyclic); } public String getTime() { StringBuffer sb = new StringBuffer(); if (currentYear == startYear) { /* int i = wv_month.getCurrentItem() + startMonth; System.out.println("i:" + i);*/ if ((wv_month.getCurrentItem() + startMonth) == startMonth) { sb.append((wv_year.getCurrentItem() + startYear)).append("-") .append((wv_month.getCurrentItem() + startMonth)).append("-") .append((wv_day.getCurrentItem() + startDay)).append(" ") .append(wv_hours.getCurrentItem()).append(":") .append(wv_mins.getCurrentItem()).append(":") .append(wv_seconds.getCurrentItem()); } else { sb.append((wv_year.getCurrentItem() + startYear)).append("-") .append((wv_month.getCurrentItem() + startMonth)).append("-") .append((wv_day.getCurrentItem() + 1)).append(" ") .append(wv_hours.getCurrentItem()).append(":") .append(wv_mins.getCurrentItem()).append(":") .append(wv_seconds.getCurrentItem()); } } else { sb.append((wv_year.getCurrentItem() + startYear)).append("-") .append((wv_month.getCurrentItem() + 1)).append("-") .append((wv_day.getCurrentItem() + 1)).append(" ") .append(wv_hours.getCurrentItem()).append(":") .append(wv_mins.getCurrentItem()).append(":") .append(wv_seconds.getCurrentItem()); } return sb.toString(); } public View getView() { return view; } public void setView(View view) { this.view = view; } public int getStartYear() { return startYear; } public void setStartYear(int startYear) { this.startYear = startYear; } public int getEndYear() { return endYear; } public void setEndYear(int endYear) { this.endYear = endYear; } public void setRangDate(Calendar startDate, Calendar endDate) { if (startDate == null && endDate != null) { int year = endDate.get(Calendar.YEAR); int month = endDate.get(Calendar.MONTH) + 1; int day = endDate.get(Calendar.DAY_OF_MONTH); if (year > startYear) { this.endYear = year; this.endMonth = month; this.endDay = day; } else if (year == startYear) { if (month > startMonth) { this.endYear = year; this.endMonth = month; this.endDay = day; } else if (month == startMonth) { if (month > startDay) { this.endYear = year; this.endMonth = month; this.endDay = day; } } } } else if (startDate != null && endDate == null) { int year = startDate.get(Calendar.YEAR); int month = startDate.get(Calendar.MONTH) + 1; int day = startDate.get(Calendar.DAY_OF_MONTH); if (year < endYear) { this.startMonth = month; this.startDay = day; this.startYear = year; } else if (year == endYear) { if (month < endMonth) { this.startMonth = month; this.startDay = day; this.startYear = year; } else if (month == endMonth) { if (day < endDay) { this.startMonth = month; this.startDay = day; this.startYear = year; } } } } else if (startDate != null && endDate != null) { this.startYear = startDate.get(Calendar.YEAR); this.endYear = endDate.get(Calendar.YEAR); this.startMonth = startDate.get(Calendar.MONTH) + 1; this.endMonth = endDate.get(Calendar.MONTH) + 1; this.startDay = startDate.get(Calendar.DAY_OF_MONTH); this.endDay = endDate.get(Calendar.DAY_OF_MONTH); } } /** * 设置间距倍数,但是只能在1.0-2.0f之间 * * @param lineSpacingMultiplier */ public void setLineSpacingMultiplier(float lineSpacingMultiplier) { this.lineSpacingMultiplier = lineSpacingMultiplier; setLineSpacingMultiplier(); } /** * 设置分割线的颜色 * * @param dividerColor */ public void setDividerColor(int dividerColor) { this.dividerColor = dividerColor; setDividerColor(); } /** * 设置分割线的类型 * * @param dividerType */ public void setDividerType(WheelView.DividerType dividerType) { this.dividerType = dividerType; setDividerType(); } /** * 设置分割线之间的文字的颜色 * * @param textColorCenter */ public void setTextColorCenter(int textColorCenter) { this.textColorCenter = textColorCenter; setTextColorCenter(); } /** * 设置分割线以外文字的颜色 * * @param textColorOut */ public void setTextColorOut(int textColorOut) { this.textColorOut = textColorOut; setTextColorOut(); } /** * Label 是否只显示中间选中项的 * * @param isCenterLabel */ public void isCenterLabel(Boolean isCenterLabel) { wv_day.isCenterLabel(isCenterLabel); wv_month.isCenterLabel(isCenterLabel); wv_year.isCenterLabel(isCenterLabel); wv_hours.isCenterLabel(isCenterLabel); wv_mins.isCenterLabel(isCenterLabel); wv_seconds.isCenterLabel(isCenterLabel); } }