package com.bigkoo.pickerview.view; import android.content.Context; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.bigkoo.pickerview.configure.PickerOptions; import com.bigkoo.pickerview.listener.ISelectTimeCallback; import com.example.pickerviewlibrary.R; 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 WheelTime wheelTime; //自定义控件 private static final String TAG_SUBMIT = "submit"; private static final String TAG_CANCEL = "cancel"; public TimePickerView(PickerOptions pickerOptions) { super(pickerOptions.context); mPickerOptions = pickerOptions; initView(pickerOptions.context); } private void initView(Context context) { setDialogOutSideCancelable(); initViews(); initAnim(); if (mPickerOptions.customListener == null) { LayoutInflater.from(context).inflate(R.layout.pickerview_time, contentContainer); //顶部标题 TextView tvTitle = (TextView) findViewById(R.id.tvTitle); RelativeLayout rv_top_bar = (RelativeLayout) findViewById(R.id.rv_topbar); //确定和取消按钮 Button btnSubmit = (Button) findViewById(R.id.btnSubmit); Button btnCancel = (Button) findViewById(R.id.btnCancel); btnSubmit.setTag(TAG_SUBMIT); btnCancel.setTag(TAG_CANCEL); btnSubmit.setOnClickListener(this); btnCancel.setOnClickListener(this); //设置文字 btnSubmit.setText(TextUtils.isEmpty(mPickerOptions.textContentConfirm) ? context.getResources().getString(R.string.pickerview_submit) : mPickerOptions.textContentConfirm); btnCancel.setText(TextUtils.isEmpty(mPickerOptions.textContentCancel) ? context.getResources().getString(R.string.pickerview_cancel) : mPickerOptions.textContentCancel); tvTitle.setText(TextUtils.isEmpty(mPickerOptions.textContentTitle) ? "" : mPickerOptions.textContentTitle);//默认为空 //设置color btnSubmit.setTextColor(mPickerOptions.textColorConfirm); btnCancel.setTextColor(mPickerOptions.textColorCancel); tvTitle.setTextColor(mPickerOptions.textColorTitle); rv_top_bar.setBackgroundColor(mPickerOptions.bgColorTitle); //设置文字大小 btnSubmit.setTextSize(mPickerOptions.textSizeSubmitCancel); btnCancel.setTextSize(mPickerOptions.textSizeSubmitCancel); tvTitle.setTextSize(mPickerOptions.textSizeTitle); } else { mPickerOptions.customListener.customLayout(LayoutInflater.from(context).inflate(mPickerOptions.layoutRes, contentContainer)); } // 时间转轮 自定义控件 LinearLayout timePickerView = (LinearLayout) findViewById(R.id.timepicker); timePickerView.setBackgroundColor(mPickerOptions.bgColorWheel); initWheelTime(timePickerView); } private void initWheelTime(LinearLayout timePickerView) { wheelTime = new WheelTime(timePickerView, mPickerOptions.type, mPickerOptions.textGravity, mPickerOptions.textSizeContent); if (mPickerOptions.timeSelectChangeListener != null) { wheelTime.setSelectChangeCallback(new ISelectTimeCallback() { @Override public void onTimeSelectChanged() { try { Date date = WheelTime.dateFormat.parse(wheelTime.getTime()); mPickerOptions.timeSelectChangeListener.onTimeSelectChanged(date); } catch (ParseException e) { e.printStackTrace(); } } }); } wheelTime.setLunarMode(mPickerOptions.isLunarCalendar); if (mPickerOptions.startYear != 0 && mPickerOptions.endYear != 0 && mPickerOptions.startYear <= mPickerOptions.endYear) { setRange(); } //若手动设置了时间范围限制 if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) { if (mPickerOptions.startDate.getTimeInMillis() > mPickerOptions.endDate.getTimeInMillis()) { throw new IllegalArgumentException("startDate can't be later than endDate"); } else { setRangDate(); } } else if (mPickerOptions.startDate != null) { if (mPickerOptions.startDate.get(Calendar.YEAR) < 1900) { throw new IllegalArgumentException("The startDate can not as early as 1900"); } else { setRangDate(); } } else if (mPickerOptions.endDate != null) { if (mPickerOptions.endDate.get(Calendar.YEAR) > 2100) { throw new IllegalArgumentException("The endDate should not be later than 2100"); } else { setRangDate(); } } else {//没有设置时间范围限制,则会使用默认范围。 setRangDate(); } setTime(); wheelTime.setLabels(mPickerOptions.label_year, mPickerOptions.label_month, mPickerOptions.label_day , mPickerOptions.label_hours, mPickerOptions.label_minutes, mPickerOptions.label_seconds); wheelTime.setTextXOffset(mPickerOptions.x_offset_year, mPickerOptions.x_offset_month, mPickerOptions.x_offset_day, mPickerOptions.x_offset_hours, mPickerOptions.x_offset_minutes, mPickerOptions.x_offset_seconds); wheelTime.setItemsVisible(mPickerOptions.itemsVisibleCount); wheelTime.setAlphaGradient(mPickerOptions.isAlphaGradient); setOutSideCancelable(mPickerOptions.cancelable); wheelTime.setCyclic(mPickerOptions.cyclic); wheelTime.setDividerColor(mPickerOptions.dividerColor); wheelTime.setDividerType(mPickerOptions.dividerType); wheelTime.setLineSpacingMultiplier(mPickerOptions.lineSpacingMultiplier); wheelTime.setTextColorOut(mPickerOptions.textColorOut); wheelTime.setTextColorCenter(mPickerOptions.textColorCenter); wheelTime.isCenterLabel(mPickerOptions.isCenterLabel); } /** * 设置默认时间 */ public void setDate(Calendar date) { mPickerOptions.date = date; setTime(); } /** * 设置可以选择的时间范围, 要在setTime之前调用才有效果 */ private void setRange() { wheelTime.setStartYear(mPickerOptions.startYear); wheelTime.setEndYear(mPickerOptions.endYear); } /** * 设置可以选择的时间范围, 要在setTime之前调用才有效果 */ private void setRangDate() { wheelTime.setRangDate(mPickerOptions.startDate, mPickerOptions.endDate); initDefaultSelectedDate(); } private void initDefaultSelectedDate() { //如果手动设置了时间范围 if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) { //若默认时间未设置,或者设置的默认时间越界了,则设置默认选中时间为开始时间。 if (mPickerOptions.date == null || mPickerOptions.date.getTimeInMillis() < mPickerOptions.startDate.getTimeInMillis() || mPickerOptions.date.getTimeInMillis() > mPickerOptions.endDate.getTimeInMillis()) { mPickerOptions.date = mPickerOptions.startDate; } } else if (mPickerOptions.startDate != null) { //没有设置默认选中时间,那就拿开始时间当默认时间 mPickerOptions.date = mPickerOptions.startDate; } else if (mPickerOptions.endDate != null) { mPickerOptions.date = mPickerOptions.endDate; } } /** * 设置选中时间,默认选中当前时间 */ private void setTime() { int year, month, day, hours, minute, seconds; Calendar calendar = Calendar.getInstance(); if (mPickerOptions.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 = mPickerOptions.date.get(Calendar.YEAR); month = mPickerOptions.date.get(Calendar.MONTH); day = mPickerOptions.date.get(Calendar.DAY_OF_MONTH); hours = mPickerOptions.date.get(Calendar.HOUR_OF_DAY); minute = mPickerOptions.date.get(Calendar.MINUTE); seconds = mPickerOptions.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(); } else if (tag.equals(TAG_CANCEL)) { if (mPickerOptions.cancelListener != null) { mPickerOptions.cancelListener.onClick(v); } } dismiss(); } public void returnData() { if (mPickerOptions.timeSelectListener != null) { try { Date date = WheelTime.dateFormat.parse(wheelTime.getTime()); mPickerOptions.timeSelectListener.onTimeSelect(date, clickView); } catch (ParseException e) { e.printStackTrace(); } } } /** * 动态设置标题 * * @param text 标题文本内容 */ public void setTitleText(String text) { TextView tvTitle = (TextView) findViewById(R.id.tvTitle); if (tvTitle != null) { tvTitle.setText(text); } } /** * 目前暂时只支持设置1900 - 2100年 * * @param lunar 农历的开关 */ public void setLunarCalendar(boolean lunar) { try { int year, month, day, hours, minute, seconds; Calendar calendar = Calendar.getInstance(); calendar.setTime(WheelTime.dateFormat.parse(wheelTime.getTime())); 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); wheelTime.setLunarMode(lunar); wheelTime.setLabels(mPickerOptions.label_year, mPickerOptions.label_month, mPickerOptions.label_day, mPickerOptions.label_hours, mPickerOptions.label_minutes, mPickerOptions.label_seconds); wheelTime.setPicker(year, month, day, hours, minute, seconds); } catch (ParseException e) { e.printStackTrace(); } } public boolean isLunarCalendar() { return wheelTime.isLunarMode(); } @Override public boolean isDialog() { return mPickerOptions.isDialog; } }