package com.bigkoo.pickerview; import android.content.Context; import android.text.TextUtils; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.bigkoo.pickerview.lib.WheelView; import com.bigkoo.pickerview.listener.CustomListener; import com.bigkoo.pickerview.view.BasePickerView; import com.bigkoo.pickerview.view.WheelTime; import java.text.ParseException; import java.util.Calendar; import java.util.Date; /** * 时间选择器 * Created by Sai on 15/11/22. * Updated by XiaoSong on 2017-2-22. */ public class TimePickerView extends BasePickerView implements View.OnClickListener { private int layoutRes; private CustomListener customListener; WheelTime wheelTime; //自定义控件 private Button btnSubmit, btnCancel; //确定、取消按钮 private TextView tvTitle;//标题 private OnTimeSelectListener timeSelectListener;//回调接口 private int gravity = Gravity.CENTER;//内容显示位置 默认居中 private boolean[] type;// 显示类型 private String Str_Submit;//确定按钮字符串 private String Str_Cancel;//取消按钮字符串 private String Str_Title;//标题字符串 private int Color_Submit;//确定按钮颜色 private int Color_Cancel;//取消按钮颜色 private int Color_Title;//标题颜色 private int Color_Background_Wheel;//滚轮背景颜色 private int Color_Background_Title;//标题背景颜色 private int Size_Submit_Cancel;//确定取消按钮大小 private int Size_Title;//标题字体大小 private int Size_Content;//内容字体大小 private Calendar date;//当前选中时间 private Calendar startDate;//开始时间 private Calendar endDate;//终止时间 private int startYear;//开始年份 private int endYear;//结尾年份 private boolean cyclic;//是否循环 private boolean cancelable;//是否能取消 private boolean isCenterLabel;//是否只显示中间的label private int textColorOut; //分割线以外的文字颜色 private int textColorCenter; //分割线之间的文字颜色 private int dividerColor; //分割线的颜色 private int backgroundId; //显示时的外部背景色颜色,默认是灰色 // 条目间距倍数 默认1.6 private float lineSpacingMultiplier = 1.6F; private boolean isDialog;//是否是对话框模式 private String label_year, label_month, label_day, label_hours, label_mins, label_seconds; private WheelView.DividerType dividerType;//分隔线类型 private static final String TAG_SUBMIT = "submit"; private static final String TAG_CANCEL = "cancel"; //构造方法 public TimePickerView(Builder builder) { super(builder.context); this.timeSelectListener = builder.timeSelectListener; this.gravity = builder.gravity; this.type = builder.type; this.Str_Submit = builder.Str_Submit; this.Str_Cancel = builder.Str_Cancel; this.Str_Title = builder.Str_Title; this.Color_Submit = builder.Color_Submit; this.Color_Cancel = builder.Color_Cancel; this.Color_Title = builder.Color_Title; this.Color_Background_Wheel = builder.Color_Background_Wheel; this.Color_Background_Title = builder.Color_Background_Title; this.Size_Submit_Cancel = builder.Size_Submit_Cancel; this.Size_Title = builder.Size_Title; this.Size_Content = builder.Size_Content; this.startYear = builder.startYear; this.endYear = builder.endYear; this.startDate = builder.startDate; this.endDate = builder.endDate; this.date = builder.date; this.cyclic = builder.cyclic; this.isCenterLabel = builder.isCenterLabel; this.cancelable = builder.cancelable; this.label_year = builder.label_year; this.label_month = builder.label_month; this.label_day = builder.label_day; this.label_hours = builder.label_hours; this.label_mins = builder.label_mins; this.label_seconds = builder.label_seconds; this.textColorCenter = builder.textColorCenter; this.textColorOut = builder.textColorOut; this.dividerColor = builder.dividerColor; this.customListener = builder.customListener; this.layoutRes = builder.layoutRes; this.lineSpacingMultiplier = builder.lineSpacingMultiplier; this.isDialog = builder.isDialog; this.dividerType = builder.dividerType; this.backgroundId = builder.backgroundId; this.decorView = builder.decorView; initView(builder.context); } //建造器 public static class Builder { private int layoutRes = R.layout.pickerview_time; private CustomListener customListener; private Context context; private OnTimeSelectListener timeSelectListener; private boolean[] type = new boolean[]{true, true, true, true, true, true};//显示类型 默认全部显示 private int gravity = Gravity.CENTER;//内容显示位置 默认居中 private String Str_Submit;//确定按钮文字 private String Str_Cancel;//取消按钮文字 private String Str_Title;//标题文字 private int Color_Submit;//确定按钮颜色 private int Color_Cancel;//取消按钮颜色 private int Color_Title;//标题颜色 private int Color_Background_Wheel;//滚轮背景颜色 private int Color_Background_Title;//标题背景颜色 private int Size_Submit_Cancel = 17;//确定取消按钮大小 private int Size_Title = 18;//标题字体大小 private int Size_Content = 18;//内容字体大小 private Calendar date;//当前选中时间 private Calendar startDate;//开始时间 private Calendar endDate;//终止时间 private int startYear;//开始年份 private int endYear;//结尾年份 private boolean cyclic = false;//是否循环 private boolean cancelable = true;//是否能取消 private boolean isCenterLabel = true ;//是否只显示中间的label public ViewGroup decorView ;//显示pickerview的根View,默认是activity的根view private int textColorOut; //分割线以外的文字颜色 private int textColorCenter; //分割线之间的文字颜色 private int dividerColor; //分割线的颜色 private int backgroundId; //显示时的外部背景色颜色,默认是灰色 private WheelView.DividerType dividerType;//分隔线类型 // 条目间距倍数 默认1.6 private float lineSpacingMultiplier = 1.6F; private boolean isDialog;//是否是对话框模式 private String label_year, label_month, label_day, label_hours, label_mins, label_seconds;//单位 //Required public Builder(Context context, OnTimeSelectListener listener) { this.context = context; this.timeSelectListener = listener; } //Option public Builder setType(boolean[] type) { this.type = type; return this; } public Builder gravity(int gravity) { this.gravity = gravity; return this; } public Builder setSubmitText(String Str_Submit) { this.Str_Submit = Str_Submit; return this; } public Builder isDialog(boolean isDialog) { this.isDialog = isDialog; return this; } public Builder setCancelText(String Str_Cancel) { this.Str_Cancel = Str_Cancel; return this; } public Builder setTitleText(String Str_Title) { this.Str_Title = Str_Title; return this; } public Builder setSubmitColor(int Color_Submit) { this.Color_Submit = Color_Submit; return this; } public Builder setCancelColor(int Color_Cancel) { this.Color_Cancel = Color_Cancel; return this; } /** * 必须是viewgroup * 设置要将pickerview显示到的容器id * @param decorView * @return */ public Builder setDecorView(ViewGroup decorView) { this.decorView = decorView; return this; } public Builder setBgColor(int Color_Background_Wheel) { this.Color_Background_Wheel = Color_Background_Wheel; return this; } public Builder setTitleBgColor(int Color_Background_Title) { this.Color_Background_Title = Color_Background_Title; return this; } public Builder setTitleColor(int Color_Title) { this.Color_Title = Color_Title; return this; } public Builder setSubCalSize(int Size_Submit_Cancel) { this.Size_Submit_Cancel = Size_Submit_Cancel; return this; } public Builder setTitleSize(int Size_Title) { this.Size_Title = Size_Title; return this; } public Builder setContentSize(int Size_Content) { this.Size_Content = Size_Content; return this; } /** * 因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11 * * @param date * @return */ public Builder setDate(Calendar date) { this.date = date; return this; } public Builder setLayoutRes(int res, CustomListener customListener) { this.layoutRes = res; this.customListener = customListener; return this; } public Builder setRange(int startYear, int endYear) { this.startYear = startYear; this.endYear = endYear; return this; } /** * 设置起始时间 * 因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11 * * @return */ public Builder setRangDate(Calendar startDate, Calendar endDate) { this.startDate = startDate; this.endDate = endDate; return this; } /** * 设置间距倍数,但是只能在1.2-2.0f之间 * * @param lineSpacingMultiplier */ public Builder setLineSpacingMultiplier(float lineSpacingMultiplier) { this.lineSpacingMultiplier = lineSpacingMultiplier; return this; } /** * 设置分割线的颜色 * * @param dividerColor */ public Builder setDividerColor(int dividerColor) { this.dividerColor = dividerColor; return this; } /** * 设置分割线的类型 * * @param dividerType */ public Builder setDividerType(WheelView.DividerType dividerType) { this.dividerType = dividerType; return this; } /** * //显示时的外部背景色颜色,默认是灰色 * @param backgroundId */ public Builder setBackgroundId(int backgroundId) { this.backgroundId = backgroundId; return this; } /** * 设置分割线之间的文字的颜色 * * @param textColorCenter */ public Builder setTextColorCenter(int textColorCenter) { this.textColorCenter = textColorCenter; return this; } /** * 设置分割线以外文字的颜色 * * @param textColorOut */ public Builder setTextColorOut(int textColorOut) { this.textColorOut = textColorOut; return this; } public Builder isCyclic(boolean cyclic) { this.cyclic = cyclic; return this; } public Builder setOutSideCancelable(boolean cancelable) { this.cancelable = cancelable; return this; } public Builder setLabel(String label_year, String label_month, String label_day, String label_hours, String label_mins, String label_seconds) { this.label_year = label_year; this.label_month = label_month; this.label_day = label_day; this.label_hours = label_hours; this.label_mins = label_mins; this.label_seconds = label_seconds; return this; } public Builder isCenterLabel(boolean isCenterLabel) { this.isCenterLabel = isCenterLabel; return this; } public TimePickerView build() { return new TimePickerView(this); } } private void initView(Context context) { setDialogOutSideCancelable(cancelable); initViews(backgroundId); init(); initEvents(); if (customListener == null) { LayoutInflater.from(context).inflate(R.layout.pickerview_time, contentContainer); //顶部标题 tvTitle = (TextView) findViewById(R.id.tvTitle); //确定和取消按钮 btnSubmit = (Button) findViewById(R.id.btnSubmit); btnCancel = (Button) findViewById(R.id.btnCancel); btnSubmit.setTag(TAG_SUBMIT); btnCancel.setTag(TAG_CANCEL); btnSubmit.setOnClickListener(this); btnCancel.setOnClickListener(this); //设置文字 btnSubmit.setText(TextUtils.isEmpty(Str_Submit) ? context.getResources().getString(R.string.pickerview_submit) : Str_Submit); btnCancel.setText(TextUtils.isEmpty(Str_Cancel) ? context.getResources().getString(R.string.pickerview_cancel) : Str_Cancel); tvTitle.setText(TextUtils.isEmpty(Str_Title) ? "" : Str_Title);//默认为空 //设置文字颜色 btnSubmit.setTextColor(Color_Submit == 0 ? pickerview_timebtn_nor : Color_Submit); btnCancel.setTextColor(Color_Cancel == 0 ? pickerview_timebtn_nor : Color_Cancel); tvTitle.setTextColor(Color_Title == 0 ? pickerview_topbar_title : Color_Title); //设置文字大小 btnSubmit.setTextSize(Size_Submit_Cancel); btnCancel.setTextSize(Size_Submit_Cancel); tvTitle.setTextSize(Size_Title); RelativeLayout rv_top_bar = (RelativeLayout) findViewById(R.id.rv_topbar); rv_top_bar.setBackgroundColor(Color_Background_Title == 0 ? pickerview_bg_topbar : Color_Background_Title); } else { customListener.customLayout(LayoutInflater.from(context).inflate(layoutRes, contentContainer)); } // 时间转轮 自定义控件 LinearLayout timePickerView = (LinearLayout) findViewById(R.id.timepicker); timePickerView.setBackgroundColor(Color_Background_Wheel == 0 ? bgColor_default : Color_Background_Wheel); wheelTime = new WheelTime(timePickerView, type, gravity, Size_Content); if (startYear != 0 && endYear != 0 && startYear <= endYear) { setRange(); } if (startDate != null && endDate != null) { if (startDate.getTimeInMillis() <= endDate.getTimeInMillis()) { setRangDate(); } } else if (startDate != null && endDate == null) { setRangDate(); } else if (startDate == null && endDate != null) { setRangDate(); } setTime(); wheelTime.setLabels(label_year, label_month, label_day, label_hours, label_mins, label_seconds); setOutSideCancelable(cancelable); wheelTime.setCyclic(cyclic); wheelTime.setDividerColor(dividerColor); wheelTime.setDividerType(dividerType); wheelTime.setLineSpacingMultiplier(lineSpacingMultiplier); wheelTime.setTextColorOut(textColorOut); wheelTime.setTextColorCenter(textColorCenter); wheelTime.isCenterLabel(isCenterLabel); } /** * 设置默认时间 */ public void setDate(Calendar date) { this.date = date; setTime(); } /** * 设置可以选择的时间范围, 要在setTime之前调用才有效果 */ private void setRange() { wheelTime.setStartYear(startYear); wheelTime.setEndYear(endYear); } /** * 设置可以选择的时间范围, 要在setTime之前调用才有效果 */ private void setRangDate() { wheelTime.setRangDate(startDate, endDate); //如果设置了时间范围 if (startDate != null && endDate != null) { //判断一下默认时间是否设置了,或者是否在起始终止时间范围内 if (date == null || date.getTimeInMillis() < startDate.getTimeInMillis() || date.getTimeInMillis() > endDate.getTimeInMillis()) { date = startDate; } } else if (startDate != null) { //没有设置默认选中时间,那就拿开始时间当默认时间 date = startDate; } else if (endDate != null) { date = endDate; } } /** * 设置选中时间,默认选中当前时间 */ private void setTime() { int year, month, day, hours, minute, seconds; Calendar calendar = Calendar.getInstance(); if (date == null) { calendar.setTimeInMillis(System.currentTimeMillis()); year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH); day = calendar.get(Calendar.DAY_OF_MONTH); hours = calendar.get(Calendar.HOUR_OF_DAY); minute = calendar.get(Calendar.MINUTE); seconds = calendar.get(Calendar.SECOND); } else { year = date.get(Calendar.YEAR); month = date.get(Calendar.MONTH); day = date.get(Calendar.DAY_OF_MONTH); hours = date.get(Calendar.HOUR_OF_DAY); minute = date.get(Calendar.MINUTE); seconds = date.get(Calendar.SECOND); } wheelTime.setPicker(year, month, day, hours, minute, seconds); } @Override public void onClick(View v) { String tag = (String) v.getTag(); if (tag.equals(TAG_SUBMIT)) { returnData(); } dismiss(); } public void returnData() { if (timeSelectListener != null) { try { Date date = WheelTime.dateFormat.parse(wheelTime.getTime()); timeSelectListener.onTimeSelect(date, clickView); } catch (ParseException e) { e.printStackTrace(); } } } public interface OnTimeSelectListener { void onTimeSelect(Date date, View v); } @Override public boolean isDialog() { return isDialog; } }