Android開(kāi)始結(jié)束時(shí)間選擇器

基于PickerView改造的開(kāi)始結(jié)束時(shí)間選擇器,PickerView是一款很好用的選擇器控件,它的時(shí)間選擇器TimePickerView和條件選擇器OptionsPickerView我至今都還在用,可惜已經(jīng)不維護(hù)了!首先我們要引入它:

implementation 'com.contrarywind:Android-PickerView:4.1.9'
  • 需求:盡管TimePickerView很好用,但也許你會(huì)遇到用戶(hù)要求一次把開(kāi)始時(shí)間和結(jié)束時(shí)間都同時(shí)選擇的情況,而不是點(diǎn)擊一個(gè)地方讓用戶(hù)選擇開(kāi)始時(shí)間,再點(diǎn)擊一個(gè)地方讓用戶(hù)選擇結(jié)束時(shí)間!于是不得不改造一個(gè)彈框出來(lái),同時(shí)選擇開(kāi)始和結(jié)束時(shí)間,大概如下所示!


    image.png

1.重寫(xiě)三個(gè)文件

文件一TimePickerBuilder2

import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.annotation.ColorInt
import com.bigkoo.pickerview.configure.PickerOptions
import com.bigkoo.pickerview.listener.CustomListener
import com.bigkoo.pickerview.listener.OnTimeSelectChangeListener
import com.contrarywind.view.WheelView.DividerType
import java.util.*

class TimePickerBuilder2(context: Context?, private val listener: (dateStart:Date, dateEnd:Date)->Unit) {
    private val mPickerOptions: PickerOptions = PickerOptions(PickerOptions.TYPE_PICKER_TIME)

    //Option
    fun setGravity(gravity: Int): TimePickerBuilder2 {
        mPickerOptions.textGravity = gravity
        return this
    }

    fun addOnCancelClickListener(cancelListener: View.OnClickListener?): TimePickerBuilder2 {
        mPickerOptions.cancelListener = cancelListener
        return this
    }

    fun setType(type: BooleanArray?): TimePickerBuilder2 {
        mPickerOptions.type = type
        return this
    }

    fun setSubmitText(textContentConfirm: String?): TimePickerBuilder2 {
        mPickerOptions.textContentConfirm = textContentConfirm
        return this
    }

    fun isDialog(isDialog: Boolean): TimePickerBuilder2 {
        mPickerOptions.isDialog = isDialog
        return this
    }

    fun setCancelText(textContentCancel: String?): TimePickerBuilder2 {
        mPickerOptions.textContentCancel = textContentCancel
        return this
    }

    fun setTitleText(textContentTitle: String?): TimePickerBuilder2 {
        mPickerOptions.textContentTitle = textContentTitle
        return this
    }

    fun setSubmitColor(textColorConfirm: Int): TimePickerBuilder2 {
        mPickerOptions.textColorConfirm = textColorConfirm
        return this
    }

    fun setCancelColor(textColorCancel: Int): TimePickerBuilder2 {
        mPickerOptions.textColorCancel = textColorCancel
        return this
    }

    /**
     * ViewGroup 類(lèi)型的容器
     *
     * @param decorView 選擇器會(huì)被添加到此容器中
     * @return TimePickerBuilder
     */
    fun setDecorView(decorView: ViewGroup?): TimePickerBuilder2 {
        mPickerOptions.decorView = decorView
        return this
    }

    fun setBgColor(bgColorWheel: Int): TimePickerBuilder2 {
        mPickerOptions.bgColorWheel = bgColorWheel
        return this
    }

    fun setTitleBgColor(bgColorTitle: Int): TimePickerBuilder2 {
        mPickerOptions.bgColorTitle = bgColorTitle
        return this
    }

    fun setTitleColor(textColorTitle: Int): TimePickerBuilder2 {
        mPickerOptions.textColorTitle = textColorTitle
        return this
    }

    fun setSubCalSize(textSizeSubmitCancel: Int): TimePickerBuilder2 {
        mPickerOptions.textSizeSubmitCancel = textSizeSubmitCancel
        return this
    }

    fun setTitleSize(textSizeTitle: Int): TimePickerBuilder2 {
        mPickerOptions.textSizeTitle = textSizeTitle
        return this
    }

    fun setContentTextSize(textSizeContent: Int): TimePickerBuilder2 {
        mPickerOptions.textSizeContent = textSizeContent
        return this
    }

    /**
     * 設(shè)置最大可見(jiàn)數(shù)目
     *
     * @param count suggest value: 3, 5, 7, 9
     */
    fun setItemVisibleCount(count: Int): TimePickerBuilder2 {
        mPickerOptions.itemsVisibleCount = count
        return this
    }

    /**
     * 透明度是否漸變
     *
     * @param isAlphaGradient true of false
     */
    fun isAlphaGradient(isAlphaGradient: Boolean): TimePickerBuilder2 {
        mPickerOptions.isAlphaGradient = isAlphaGradient
        return this
    }

    /**
     * 因?yàn)橄到y(tǒng)Calendar的月份是從0-11的,所以如果是調(diào)用Calendar的set方法來(lái)設(shè)置時(shí)間,月份的范圍也要是從0-11
     *
     * @param date
     * @return TimePickerBuilder
     */
    fun setDate(date: Calendar?): TimePickerBuilder2 {
        mPickerOptions.date = date
        return this
    }

    fun setLayoutRes(res: Int, customListener: CustomListener?): TimePickerBuilder2 {
        mPickerOptions.layoutRes = res
        mPickerOptions.customListener = customListener
        return this
    }

    /**
     * 設(shè)置起始時(shí)間
     * 因?yàn)橄到y(tǒng)Calendar的月份是從0-11的,所以如果是調(diào)用Calendar的set方法來(lái)設(shè)置時(shí)間,月份的范圍也要是從0-11
     */
    fun setRangDate(startDate: Calendar?, endDate: Calendar?): TimePickerBuilder2 {
        mPickerOptions.startDate = startDate
        mPickerOptions.endDate = endDate
        return this
    }

    /**
     * 設(shè)置間距倍數(shù),但是只能在1.0-4.0f之間
     *
     * @param lineSpacingMultiplier
     */
    fun setLineSpacingMultiplier(lineSpacingMultiplier: Float): TimePickerBuilder2 {
        mPickerOptions.lineSpacingMultiplier = lineSpacingMultiplier
        return this
    }

    /**
     * 設(shè)置分割線(xiàn)的顏色
     *
     * @param dividerColor
     */
    fun setDividerColor(@ColorInt dividerColor: Int): TimePickerBuilder2 {
        mPickerOptions.dividerColor = dividerColor
        return this
    }

    /**
     * 設(shè)置分割線(xiàn)的類(lèi)型
     *
     * @param dividerType
     */
    fun setDividerType(dividerType: DividerType?): TimePickerBuilder2 {
        mPickerOptions.dividerType = dividerType
        return this
    }

    /**
     * [.setOutSideColor] instead.
     *
     * @param backgroundId color resId.
     */
    @Deprecated("")
    fun setBackgroundId(backgroundId: Int): TimePickerBuilder2 {
        mPickerOptions.outSideColor = backgroundId
        return this
    }

    /**
     * 顯示時(shí)的外部背景色顏色,默認(rèn)是灰色
     *
     * @param outSideColor
     */
    fun setOutSideColor(@ColorInt outSideColor: Int): TimePickerBuilder2 {
        mPickerOptions.outSideColor = outSideColor
        return this
    }

    /**
     * 設(shè)置分割線(xiàn)之間的文字的顏色
     *
     * @param textColorCenter
     */
    fun setTextColorCenter(@ColorInt textColorCenter: Int): TimePickerBuilder2 {
        mPickerOptions.textColorCenter = textColorCenter
        return this
    }

    /**
     * 設(shè)置分割線(xiàn)以外文字的顏色
     *
     * @param textColorOut
     */
    fun setTextColorOut(@ColorInt textColorOut: Int): TimePickerBuilder2 {
        mPickerOptions.textColorOut = textColorOut
        return this
    }

    fun isCyclic(cyclic: Boolean): TimePickerBuilder2 {
        mPickerOptions.cyclic = cyclic
        return this
    }

    fun setOutSideCancelable(cancelable: Boolean): TimePickerBuilder2 {
        mPickerOptions.cancelable = cancelable
        return this
    }

    fun setLabel(
        label_year: String?,
        label_month: String?,
        label_day: String?
    ): TimePickerBuilder2 {
        mPickerOptions.label_year = label_year
        mPickerOptions.label_month = label_month
        mPickerOptions.label_day = label_day
        return this
    }

    /**
     * 設(shè)置X軸傾斜角度[ -90 , 90°]
     *
     * @param x_offset_year    年
     * @param x_offset_month   月
     * @param x_offset_day     日
     * @return
     */
    fun setTextXOffset(
        x_offset_year: Int,
        x_offset_month: Int,
        x_offset_day: Int
    ): TimePickerBuilder2 {
        mPickerOptions.x_offset_year = x_offset_year
        mPickerOptions.x_offset_month = x_offset_month
        mPickerOptions.x_offset_day = x_offset_day
        return this
    }

    fun isCenterLabel(isCenterLabel: Boolean): TimePickerBuilder2 {
        mPickerOptions.isCenterLabel = isCenterLabel
        return this
    }


    fun setTimeSelectChangeListener(listener: OnTimeSelectChangeListener?): TimePickerBuilder2 {
        mPickerOptions.timeSelectChangeListener = listener
        return this
    }

    fun build(): TimePickerView2 {
        return TimePickerView2(mPickerOptions, listener)
    }

    init {
        mPickerOptions.context = context
    }
}

文件二TimePickerView2

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.view.BasePickerView
import java.text.ParseException
import java.util.*

class TimePickerView2(pickerOptions: PickerOptions,val listener:(dateStart:Date,dateEnd:Date)->Unit) : BasePickerView(pickerOptions.context),
    View.OnClickListener {
    private var wheelTime2 //自定義控件
            : WheelTime2? = null

    private fun initView(context: Context) {
        setDialogOutSideCancelable()
        initViews()
        initAnim()
        if (mPickerOptions.customListener == null) {
            LayoutInflater.from(context).inflate(R.layout.pickerview_time2, contentContainer)

            //頂部標(biāo)題
            val tvTitle = findViewById(R.id.tvTitle) as TextView
            val rvTopBar = findViewById(R.id.rv_topbar) as RelativeLayout

            //確定和取消按鈕
            val btnSubmit = findViewById(R.id.btnSubmit) as Button
            val btnCancel = findViewById(R.id.btnCancel) as Button
            btnSubmit.tag = TAG_SUBMIT
            btnCancel.tag = TAG_CANCEL
            btnSubmit.setOnClickListener(this)
            btnCancel.setOnClickListener(this)

            //設(shè)置文字
            btnSubmit.text =
                if (TextUtils.isEmpty(mPickerOptions.textContentConfirm)) "確定" else mPickerOptions.textContentConfirm
            btnCancel.text =
                if (TextUtils.isEmpty(mPickerOptions.textContentCancel)) "取消" else mPickerOptions.textContentCancel
            tvTitle.text =
                if (TextUtils.isEmpty(mPickerOptions.textContentTitle)) "" else mPickerOptions.textContentTitle //默認(rèn)為空

            //設(shè)置color
            btnSubmit.setTextColor(mPickerOptions.textColorConfirm)
            btnCancel.setTextColor(mPickerOptions.textColorCancel)
            tvTitle.setTextColor(mPickerOptions.textColorTitle)
            rvTopBar.setBackgroundColor(mPickerOptions.bgColorTitle)

            //設(shè)置文字大小
            btnSubmit.textSize = mPickerOptions.textSizeSubmitCancel.toFloat()
            btnCancel.textSize = mPickerOptions.textSizeSubmitCancel.toFloat()
            tvTitle.textSize = mPickerOptions.textSizeTitle.toFloat()
        } else {
            mPickerOptions.customListener.customLayout(
                LayoutInflater.from(context).inflate(mPickerOptions.layoutRes, contentContainer)
            )
        }
        // 時(shí)間轉(zhuǎn)輪 自定義控件
        val timePickerView = findViewById(R.id.timepicker) as LinearLayout
        val timePickerView2 = findViewById(R.id.timepicker2) as LinearLayout
        timePickerView.setBackgroundColor(mPickerOptions.bgColorWheel)
        timePickerView2.setBackgroundColor(mPickerOptions.bgColorWheel)
        initWheelTime2(timePickerView, timePickerView2)
    }

    private fun initWheelTime2(timePickerView: LinearLayout, timePickerView2: LinearLayout) {
        wheelTime2 = WheelTime2(
            timePickerView,
            timePickerView2,
            mPickerOptions.type,
            mPickerOptions.textGravity,
            mPickerOptions.textSizeContent
        )
//        if (listener != null) {
//            wheelTime2!!.setSelectChangeCallback {
//                try {
//                    val date = WheelTime2.dateFormat.parse(wheelTime2!!.time)
//                    val date2 = WheelTime2.dateFormat.parse(wheelTime2!!.time2)
//                    listener(date,date2)
//
//                } catch (e: ParseException) {
//                    e.printStackTrace()
//                }
//            }
//        }
        if (mPickerOptions.startYear != 0 && mPickerOptions.endYear != 0 && mPickerOptions.startYear <= mPickerOptions.endYear) {
            setRange()
        }

        //若手動(dòng)設(shè)置了時(shí)間范圍限制
        if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) {
            require(mPickerOptions.startDate.timeInMillis <= mPickerOptions.endDate.timeInMillis) { "startDate can't be later than endDate" }
            setRangDate()
        } else if (mPickerOptions.startDate != null) {
            require(mPickerOptions.startDate[Calendar.YEAR] >= 1900) { "The startDate can not as early as 1900" }
            setRangDate()
        } else if (mPickerOptions.endDate != null) {
            require(mPickerOptions.endDate[Calendar.YEAR] <= 2100) { "The endDate should not be later than 2100" }
            setRangDate()
        } else { //沒(méi)有設(shè)置時(shí)間范圍限制凝赛,則會(huì)使用默認(rèn)范圍争涌。
            setRangDate()
        }
        setTime()
        wheelTime2!!.setLabels(
            mPickerOptions.label_year,
            mPickerOptions.label_month,
            mPickerOptions.label_day
        )
        wheelTime2!!.setTextXOffset(
            mPickerOptions.x_offset_year,
            mPickerOptions.x_offset_month,
            mPickerOptions.x_offset_day
        )
        wheelTime2!!.setItemsVisible(mPickerOptions.itemsVisibleCount)
        wheelTime2!!.setAlphaGradient(mPickerOptions.isAlphaGradient)
        setOutSideCancelable(mPickerOptions.cancelable)
        wheelTime2!!.setCyclic(mPickerOptions.cyclic)
        wheelTime2!!.setDividerColor(mPickerOptions.dividerColor)
        wheelTime2!!.setDividerType(mPickerOptions.dividerType)
        wheelTime2!!.setLineSpacingMultiplier(mPickerOptions.lineSpacingMultiplier)
        wheelTime2!!.setTextColorOut(mPickerOptions.textColorOut)
        wheelTime2!!.setTextColorCenter(mPickerOptions.textColorCenter)
        wheelTime2!!.isCenterLabel(mPickerOptions.isCenterLabel)
    }

    /**
     * 設(shè)置默認(rèn)時(shí)間
     */
    fun setDate(date: Calendar?) {
        mPickerOptions.date = date
        setTime()
    }

    /**
     * 設(shè)置可以選擇的時(shí)間范圍, 要在setTime之前調(diào)用才有效果
     */
    private fun setRange() {
        wheelTime2!!.startYear = mPickerOptions.startYear
        wheelTime2!!.endYear = mPickerOptions.endYear
    }

    /**
     * 設(shè)置可以選擇的時(shí)間范圍, 要在setTime之前調(diào)用才有效果
     */
    private fun setRangDate() {
        wheelTime2!!.setRangDate(mPickerOptions.startDate, mPickerOptions.endDate)
        initDefaultSelectedDate()
    }

    private fun initDefaultSelectedDate() {
        //如果手動(dòng)設(shè)置了時(shí)間范圍
        if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) {
            //若默認(rèn)時(shí)間未設(shè)置黄娘,或者設(shè)置的默認(rèn)時(shí)間越界了,則設(shè)置默認(rèn)選中時(shí)間為開(kāi)始時(shí)間魏身。
            if (mPickerOptions.date == null || mPickerOptions.date.timeInMillis < mPickerOptions.startDate.timeInMillis || mPickerOptions.date.timeInMillis > mPickerOptions.endDate.timeInMillis) {
                mPickerOptions.date = mPickerOptions.startDate
            }
        } else if (mPickerOptions.startDate != null) {
            //沒(méi)有設(shè)置默認(rèn)選中時(shí)間,那就拿開(kāi)始時(shí)間當(dāng)默認(rèn)時(shí)間
            mPickerOptions.date = mPickerOptions.startDate
        } else if (mPickerOptions.endDate != null) {
            mPickerOptions.date = mPickerOptions.endDate
        }
    }

    /**
     * 設(shè)置選中時(shí)間,默認(rèn)選中當(dāng)前時(shí)間
     */
    private fun setTime() {
        val year: Int
        val month: Int
        val day: Int
        var hours: Int
        var minute: Int
        var seconds: Int
        val calendar = Calendar.getInstance()
        if (mPickerOptions.date == null) {
            calendar.timeInMillis = System.currentTimeMillis()
            year = calendar[Calendar.YEAR]
            month = calendar[Calendar.MONTH]
            day = calendar[Calendar.DAY_OF_MONTH]
        } else {
            year = mPickerOptions.date[Calendar.YEAR]
            month = mPickerOptions.date[Calendar.MONTH]
            day = mPickerOptions.date[Calendar.DAY_OF_MONTH]
        }
        wheelTime2!!.setPicker(year, month, day)
    }

    override fun onClick(v: View) {
        val tag = v.tag as String
        if (tag == TAG_SUBMIT) {
            returnData()
        } else if (tag == TAG_CANCEL) {
            if (mPickerOptions.cancelListener != null) {
                mPickerOptions.cancelListener.onClick(v)
            }
        }
        dismiss()
    }

    private fun returnData() {
        if (listener != null) {
            try {
                val date = WheelTime2.dateFormat.parse(wheelTime2!!.time)
                val date2 = WheelTime2.dateFormat.parse(wheelTime2!!.time2)
                listener(date,date2)
            } catch (e: ParseException) {
                e.printStackTrace()
            }
        }
    }

    /**
     * 動(dòng)態(tài)設(shè)置標(biāo)題
     *
     * @param text 標(biāo)題文本內(nèi)容
     */
    fun setTitleText(text: String?) {
        val tvTitle = findViewById(R.id.tvTitle) as TextView
        if (tvTitle != null) {
            tvTitle.text = text
        }
    }

    override fun isDialog(): Boolean {
        return mPickerOptions.isDialog
    }

    companion object {
        private const val TAG_SUBMIT = "submit"
        private const val TAG_CANCEL = "cancel"
    }

    init {
        mPickerOptions = pickerOptions
        initView(pickerOptions.context)
    }
}

文件三WheelTime2

import android.view.View
import com.bigkoo.pickerview.adapter.NumericWheelAdapter
import com.bigkoo.pickerview.listener.ISelectTimeCallback
import com.contrarywind.view.WheelView
import com.contrarywind.view.WheelView.DividerType
import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.*

class WheelTime2(
    private val view: View,
    private val view2: View,
    private val type: BooleanArray,
    private val gravity: Int,
    private val textSize: Int
) {
    private var wv_year: WheelView? = null
    private var wv_month: WheelView? = null
    private var wv_day: WheelView? = null
    private var wv_year2: WheelView? = null
    private var wv_month2: WheelView? = null
    private var wv_day2: WheelView? = null
    var startYear = DEFAULT_START_YEAR
    var endYear = DEFAULT_END_YEAR
    private var startMonth = DEFAULT_START_MONTH
    private var endMonth = DEFAULT_END_MONTH
    private var startDay = DEFAULT_START_DAY
    private var endDay = DEFAULT_END_DAY //表示31天的
    private var currentYear = 0
    private var mSelectChangeCallback: ISelectTimeCallback? = null
    fun setPicker(year: Int, month: Int, day: Int) {
        setSolar(year, month, day)
        setSolar2(year, month, day)
        setContentTextSize()
    }

    /**
     * 設(shè)置公歷
     *
     * @param year
     * @param month
     * @param day
     */
    private fun setSolar(year: Int, month: Int, day: Int) {
        // 添加大小月月份并將其轉(zhuǎn)換為list,方便之后的判斷
        val months_big = arrayOf("1", "3", "5", "7", "8", "10", "12")
        val months_little = arrayOf("4", "6", "9", "11")
        val list_big = Arrays.asList(*months_big)
        val list_little = Arrays.asList(*months_little)
        currentYear = year
        // 年
        wv_year = view.findViewById<View>(R.id.year) as WheelView
        wv_year!!.adapter = NumericWheelAdapter(startYear, endYear) // 設(shè)置"年"的顯示數(shù)據(jù)
        wv_year!!.currentItem = year - startYear // 初始化時(shí)顯示的數(shù)據(jù)
        wv_year!!.setGravity(gravity)
        // 月
        wv_month = view.findViewById<View>(R.id.month) as WheelView
        if (startYear == endYear) { //開(kāi)始年等于終止年
            wv_month!!.adapter = NumericWheelAdapter(startMonth, endMonth)
            wv_month!!.currentItem = month + 1 - startMonth
        } else if (year == startYear) {
            //起始日期的月份控制
            wv_month!!.adapter = NumericWheelAdapter(startMonth, 12)
            wv_month!!.currentItem = month + 1 - startMonth
        } else if (year == endYear) {
            //終止日期的月份控制
            wv_month!!.adapter = NumericWheelAdapter(1, endMonth)
            wv_month!!.currentItem = month
        } else {
            wv_month!!.adapter = NumericWheelAdapter(1, 12)
            wv_month!!.currentItem = month
        }
        wv_month!!.setGravity(gravity)
        // 日
        wv_day = view.findViewById<View>(R.id.day) as WheelView
        val leapYear = year % 4 == 0 && year % 100 != 0 || year % 400 == 0
        if (startYear == endYear && startMonth == endMonth) {
            if (list_big.contains((month + 1).toString())) {
                if (endDay > 31) {
                    endDay = 31
                }
                wv_day!!.adapter = NumericWheelAdapter(startDay, endDay)
            } else if (list_little.contains((month + 1).toString())) {
                if (endDay > 30) {
                    endDay = 30
                }
                wv_day!!.adapter = NumericWheelAdapter(startDay, endDay)
            } else {
                // 閏年
                if (leapYear) {
                    if (endDay > 29) {
                        endDay = 29
                    }
                    wv_day!!.adapter = NumericWheelAdapter(startDay, endDay)
                } else {
                    if (endDay > 28) {
                        endDay = 28
                    }
                    wv_day!!.adapter = NumericWheelAdapter(startDay, endDay)
                }
            }
            wv_day!!.currentItem = day - startDay
        } else if (year == startYear && month + 1 == startMonth) {
            // 起始日期的天數(shù)控制
            if (list_big.contains((month + 1).toString())) {
                wv_day!!.adapter = NumericWheelAdapter(startDay, 31)
            } else if (list_little.contains((month + 1).toString())) {
                wv_day!!.adapter = NumericWheelAdapter(startDay, 30)
            } else {
                // 閏年 29,平年 28
                wv_day!!.adapter = NumericWheelAdapter(startDay, if (leapYear) 29 else 28)
            }
            wv_day!!.currentItem = day - startDay
        } else if (year == endYear && month + 1 == endMonth) {
            // 終止日期的天數(shù)控制
            if (list_big.contains((month + 1).toString())) {
                if (endDay > 31) {
                    endDay = 31
                }
                wv_day!!.adapter = NumericWheelAdapter(1, endDay)
            } else if (list_little.contains((month + 1).toString())) {
                if (endDay > 30) {
                    endDay = 30
                }
                wv_day!!.adapter = NumericWheelAdapter(1, endDay)
            } else {
                // 閏年
                if (leapYear) {
                    if (endDay > 29) {
                        endDay = 29
                    }
                    wv_day!!.adapter = NumericWheelAdapter(1, endDay)
                } else {
                    if (endDay > 28) {
                        endDay = 28
                    }
                    wv_day!!.adapter = NumericWheelAdapter(1, endDay)
                }
            }
            wv_day!!.currentItem = day - 1
        } else {
            // 判斷大小月及是否閏年,用來(lái)確定"日"的數(shù)據(jù)
            if (list_big.contains((month + 1).toString())) {
                wv_day!!.adapter = NumericWheelAdapter(1, 31)
            } else if (list_little.contains((month + 1).toString())) {
                wv_day!!.adapter = NumericWheelAdapter(1, 30)
            } else {
                // 閏年 29,平年 28
                wv_day!!.adapter = NumericWheelAdapter(startDay, if (leapYear) 29 else 28)
            }
            wv_day!!.currentItem = day - 1
        }
        wv_day!!.setGravity(gravity)

        // 添加"年"監(jiān)聽(tīng)
        wv_year!!.setOnItemSelectedListener { index ->
            val year_num = index + startYear
            currentYear = year_num
            var currentMonthItem = wv_month!!.currentItem //記錄上一次的item位置
            // 判斷大小月及是否閏年,用來(lái)確定"日"的數(shù)據(jù)
            if (startYear == endYear) {
                //重新設(shè)置月份
                wv_month!!.adapter = NumericWheelAdapter(startMonth, endMonth)
                if (currentMonthItem > wv_month!!.adapter.itemsCount - 1) {
                    currentMonthItem = wv_month!!.adapter.itemsCount - 1
                    wv_month!!.currentItem = currentMonthItem
                }
                val monthNum = currentMonthItem + startMonth
                if (startMonth == endMonth) {
                    //重新設(shè)置日
                    setReDay(year_num, monthNum, startDay, endDay, list_big, list_little)
                } else if (monthNum == startMonth) {
                    //重新設(shè)置日
                    setReDay(year_num, monthNum, startDay, 31, list_big, list_little)
                } else if (monthNum == endMonth) {
                    setReDay(year_num, monthNum, 1, endDay, list_big, list_little)
                } else { //重新設(shè)置日
                    setReDay(year_num, monthNum, 1, 31, list_big, list_little)
                }
            } else if (year_num == startYear) { //等于開(kāi)始的年
                //重新設(shè)置月份
                wv_month!!.adapter = NumericWheelAdapter(startMonth, 12)
                if (currentMonthItem > wv_month!!.adapter.itemsCount - 1) {
                    currentMonthItem = wv_month!!.adapter.itemsCount - 1
                    wv_month!!.currentItem = currentMonthItem
                }
                val month = currentMonthItem + startMonth
                if (month == startMonth) {
                    //重新設(shè)置日
                    setReDay(year_num, month, startDay, 31, list_big, list_little)
                } else {
                    //重新設(shè)置日
                    setReDay(year_num, month, 1, 31, list_big, list_little)
                }
            } else if (year_num == endYear) {
                //重新設(shè)置月份
                wv_month!!.adapter = NumericWheelAdapter(1, endMonth)
                if (currentMonthItem > wv_month!!.adapter.itemsCount - 1) {
                    currentMonthItem = wv_month!!.adapter.itemsCount - 1
                    wv_month!!.currentItem = currentMonthItem
                }
                val monthNum = currentMonthItem + 1
                if (monthNum == endMonth) {
                    //重新設(shè)置日
                    setReDay(year_num, monthNum, 1, endDay, list_big, list_little)
                } else {
                    //重新設(shè)置日
                    setReDay(year_num, monthNum, 1, 31, list_big, list_little)
                }
            } else {
                //重新設(shè)置月份
                wv_month!!.adapter = NumericWheelAdapter(1, 12)
                //重新設(shè)置日
                setReDay(year_num, wv_month!!.currentItem + 1, 1, 31, list_big, list_little)
            }
            if (mSelectChangeCallback != null) {
                mSelectChangeCallback!!.onTimeSelectChanged()
            }
        }


        // 添加"月"監(jiān)聽(tīng)
        wv_month!!.setOnItemSelectedListener { index ->
            var month_num = index + 1
            if (startYear == endYear) {
                month_num = month_num + startMonth - 1
                if (startMonth == endMonth) {
                    //重新設(shè)置日
                    setReDay(currentYear, month_num, startDay, endDay, list_big, list_little)
                } else if (startMonth == month_num) {

                    //重新設(shè)置日
                    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) {
                    //重新設(shè)置日
                    setReDay(currentYear, month_num, startDay, 31, list_big, list_little)
                } else {
                    //重新設(shè)置日
                    setReDay(currentYear, month_num, 1, 31, list_big, list_little)
                }
            } else if (currentYear == endYear) {
                if (month_num == endMonth) {
                    //重新設(shè)置日
                    setReDay(
                        currentYear,
                        wv_month!!.currentItem + 1,
                        1,
                        endDay,
                        list_big,
                        list_little
                    )
                } else {
                    setReDay(currentYear, wv_month!!.currentItem + 1, 1, 31, list_big, list_little)
                }
            } else {
                //重新設(shè)置日
                setReDay(currentYear, month_num, 1, 31, list_big, list_little)
            }
            if (mSelectChangeCallback != null) {
                mSelectChangeCallback!!.onTimeSelectChanged()
            }
        }
        setChangedListener(wv_day)
        require(type.size == 6) { "type[] length is not 6" }
        wv_year!!.visibility = if (type[0]) View.VISIBLE else View.GONE
        wv_month!!.visibility = if (type[1]) View.VISIBLE else View.GONE
        wv_day!!.visibility = if (type[2]) View.VISIBLE else View.GONE
    }

    private fun setSolar2(year: Int, month: Int, day: Int) {
        // 添加大小月月份并將其轉(zhuǎn)換為list,方便之后的判斷
        val months_big = arrayOf("1", "3", "5", "7", "8", "10", "12")
        val months_little = arrayOf("4", "6", "9", "11")
        val list_big = Arrays.asList(*months_big)
        val list_little = Arrays.asList(*months_little)
        currentYear = year
        // 年
        wv_year2 = view2.findViewById<View>(R.id.year2) as WheelView
        wv_year2!!.adapter = NumericWheelAdapter(startYear, endYear) // 設(shè)置"年"的顯示數(shù)據(jù)
        wv_year2!!.currentItem = year - startYear // 初始化時(shí)顯示的數(shù)據(jù)
        wv_year2!!.setGravity(gravity)
        // 月
        wv_month2 = view2.findViewById<View>(R.id.month2) as WheelView
        if (startYear == endYear) { //開(kāi)始年等于終止年
            wv_month2!!.adapter = NumericWheelAdapter(startMonth, endMonth)
            wv_month2!!.currentItem = month + 1 - startMonth
        } else if (year == startYear) {
            //起始日期的月份控制
            wv_month2!!.adapter = NumericWheelAdapter(startMonth, 12)
            wv_month2!!.currentItem = month + 1 - startMonth
        } else if (year == endYear) {
            //終止日期的月份控制
            wv_month2!!.adapter = NumericWheelAdapter(1, endMonth)
            wv_month2!!.currentItem = month
        } else {
            wv_month2!!.adapter = NumericWheelAdapter(1, 12)
            wv_month2!!.currentItem = month
        }
        wv_month2!!.setGravity(gravity)
        // 日
        wv_day2 = view2.findViewById<View>(R.id.day2) as WheelView
        val leapYear = year % 4 == 0 && year % 100 != 0 || year % 400 == 0
        if (startYear == endYear && startMonth == endMonth) {
            if (list_big.contains((month + 1).toString())) {
                if (endDay > 31) {
                    endDay = 31
                }
                wv_day2!!.adapter = NumericWheelAdapter(startDay, endDay)
            } else if (list_little.contains((month + 1).toString())) {
                if (endDay > 30) {
                    endDay = 30
                }
                wv_day2!!.adapter = NumericWheelAdapter(startDay, endDay)
            } else {
                // 閏年
                if (leapYear) {
                    if (endDay > 29) {
                        endDay = 29
                    }
                    wv_day2!!.adapter = NumericWheelAdapter(startDay, endDay)
                } else {
                    if (endDay > 28) {
                        endDay = 28
                    }
                    wv_day2!!.adapter = NumericWheelAdapter(startDay, endDay)
                }
            }
            wv_day2!!.currentItem = day - startDay
        } else if (year == startYear && month + 1 == startMonth) {
            // 起始日期的天數(shù)控制
            if (list_big.contains((month + 1).toString())) {
                wv_day2!!.adapter = NumericWheelAdapter(startDay, 31)
            } else if (list_little.contains((month + 1).toString())) {
                wv_day2!!.adapter = NumericWheelAdapter(startDay, 30)
            } else {
                // 閏年 29,平年 28
                wv_day2!!.adapter = NumericWheelAdapter(startDay, if (leapYear) 29 else 28)
            }
            wv_day2!!.currentItem = day - startDay
        } else if (year == endYear && month + 1 == endMonth) {
            // 終止日期的天數(shù)控制
            if (list_big.contains((month + 1).toString())) {
                if (endDay > 31) {
                    endDay = 31
                }
                wv_day2!!.adapter = NumericWheelAdapter(1, endDay)
            } else if (list_little.contains((month + 1).toString())) {
                if (endDay > 30) {
                    endDay = 30
                }
                wv_day2!!.adapter = NumericWheelAdapter(1, endDay)
            } else {
                // 閏年
                if (leapYear) {
                    if (endDay > 29) {
                        endDay = 29
                    }
                    wv_day!!.adapter = NumericWheelAdapter(1, endDay)
                } else {
                    if (endDay > 28) {
                        endDay = 28
                    }
                    wv_day2!!.adapter = NumericWheelAdapter(1, endDay)
                }
            }
            wv_day2!!.currentItem = day - 1
        } else {
            // 判斷大小月及是否閏年,用來(lái)確定"日"的數(shù)據(jù)
            if (list_big.contains((month + 1).toString())) {
                wv_day2!!.adapter = NumericWheelAdapter(1, 31)
            } else if (list_little.contains((month + 1).toString())) {
                wv_day2!!.adapter = NumericWheelAdapter(1, 30)
            } else {
                // 閏年 29绰咽,平年 28
                wv_day2!!.adapter = NumericWheelAdapter(startDay, if (leapYear) 29 else 28)
            }
            wv_day2!!.currentItem = day - 1
        }
        wv_day2!!.setGravity(gravity)


        // 添加"年"監(jiān)聽(tīng)
        wv_year2!!.setOnItemSelectedListener { index ->
            val year_num = index + startYear
            currentYear = year_num
            var currentMonthItem = wv_month2!!.currentItem //記錄上一次的item位置
            // 判斷大小月及是否閏年,用來(lái)確定"日"的數(shù)據(jù)
            if (startYear == endYear) {
                //重新設(shè)置月份
                wv_month2!!.adapter = NumericWheelAdapter(startMonth, endMonth)
                if (currentMonthItem > wv_month2!!.adapter.itemsCount - 1) {
                    currentMonthItem = wv_month2!!.adapter.itemsCount - 1
                    wv_month2!!.currentItem = currentMonthItem
                }
                val monthNum = currentMonthItem + startMonth
                if (startMonth == endMonth) {
                    //重新設(shè)置日
                    setReDay(year_num, monthNum, startDay, endDay, list_big, list_little)
                } else if (monthNum == startMonth) {
                    //重新設(shè)置日
                    setReDay(year_num, monthNum, startDay, 31, list_big, list_little)
                } else if (monthNum == endMonth) {
                    setReDay(year_num, monthNum, 1, endDay, list_big, list_little)
                } else { //重新設(shè)置日
                    setReDay(year_num, monthNum, 1, 31, list_big, list_little)
                }
            } else if (year_num == startYear) { //等于開(kāi)始的年
                //重新設(shè)置月份
                wv_month2!!.adapter = NumericWheelAdapter(startMonth, 12)
                if (currentMonthItem > wv_month2!!.adapter.itemsCount - 1) {
                    currentMonthItem = wv_month2!!.adapter.itemsCount - 1
                    wv_month2!!.currentItem = currentMonthItem
                }
                val month = currentMonthItem + startMonth
                if (month == startMonth) {
                    //重新設(shè)置日
                    setReDay(year_num, month, startDay, 31, list_big, list_little)
                } else {
                    //重新設(shè)置日
                    setReDay(year_num, month, 1, 31, list_big, list_little)
                }
            } else if (year_num == endYear) {
                //重新設(shè)置月份
                wv_month2!!.adapter = NumericWheelAdapter(1, endMonth)
                if (currentMonthItem > wv_month2!!.adapter.itemsCount - 1) {
                    currentMonthItem = wv_month2!!.adapter.itemsCount - 1
                    wv_month2!!.currentItem = currentMonthItem
                }
                val monthNum = currentMonthItem + 1
                if (monthNum == endMonth) {
                    //重新設(shè)置日
                    setReDay(year_num, monthNum, 1, endDay, list_big, list_little)
                } else {
                    //重新設(shè)置日
                    setReDay(year_num, monthNum, 1, 31, list_big, list_little)
                }
            } else {
                //重新設(shè)置月份
                wv_month2!!.adapter = NumericWheelAdapter(1, 12)
                //重新設(shè)置日
                setReDay(year_num, wv_month2!!.currentItem + 1, 1, 31, list_big, list_little)
            }
            if (mSelectChangeCallback != null) {
                mSelectChangeCallback!!.onTimeSelectChanged()
            }
        }


        // 添加"月"監(jiān)聽(tīng)
        wv_month2!!.setOnItemSelectedListener { index ->
            var month_num = index + 1
            if (startYear == endYear) {
                month_num = month_num + startMonth - 1
                if (startMonth == endMonth) {
                    //重新設(shè)置日
                    setReDay(currentYear, month_num, startDay, endDay, list_big, list_little)
                } else if (startMonth == month_num) {

                    //重新設(shè)置日
                    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) {
                    //重新設(shè)置日
                    setReDay(currentYear, month_num, startDay, 31, list_big, list_little)
                } else {
                    //重新設(shè)置日
                    setReDay(currentYear, month_num, 1, 31, list_big, list_little)
                }
            } else if (currentYear == endYear) {
                if (month_num == endMonth) {
                    //重新設(shè)置日
                    setReDay(
                        currentYear,
                        wv_month2!!.currentItem + 1,
                        1,
                        endDay,
                        list_big,
                        list_little
                    )
                } else {
                    setReDay(currentYear, wv_month2!!.currentItem + 1, 1, 31, list_big, list_little)
                }
            } else {
                //重新設(shè)置日
                setReDay(currentYear, month_num, 1, 31, list_big, list_little)
            }
            if (mSelectChangeCallback != null) {
                mSelectChangeCallback!!.onTimeSelectChanged()
            }
        }
        setChangedListener(wv_day2)
        require(type.size == 6) { "type[] length is not 6" }
        wv_year2!!.visibility = if (type[0]) View.VISIBLE else View.GONE
        wv_month2!!.visibility = if (type[1]) View.VISIBLE else View.GONE
        wv_day2!!.visibility = if (type[2]) View.VISIBLE else View.GONE
    }

    private fun setChangedListener(wheelView: WheelView?) {
        if (mSelectChangeCallback != null) {
            wheelView!!.setOnItemSelectedListener { mSelectChangeCallback!!.onTimeSelectChanged() }
        }
    }

    private fun setReDay(
        year_num: Int,
        monthNum: Int,
        startD: Int,
        endD: Int,
        list_big: List<String>,
        list_little: List<String>
    ) {
        var endD = endD
        var currentItem = wv_day!!.currentItem

//        int maxItem;
        if (list_big.contains(monthNum.toString())) {
            if (endD > 31) {
                endD = 31
            }
            wv_day!!.adapter = NumericWheelAdapter(startD, endD)
            //            maxItem = endD;
        } else if (list_little.contains(monthNum.toString())) {
            if (endD > 30) {
                endD = 30
            }
            wv_day!!.adapter = 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!!.adapter = NumericWheelAdapter(startD, endD)
                //                maxItem = endD;
            } else {
                if (endD > 28) {
                    endD = 28
                }
                wv_day!!.adapter = NumericWheelAdapter(startD, endD)
                //                maxItem = endD;
            }
        }
        if (currentItem > wv_day!!.adapter.itemsCount - 1) {
            currentItem = wv_day!!.adapter.itemsCount - 1
            wv_day!!.currentItem = currentItem
        }
    }

    private fun setContentTextSize() {
        wv_day!!.setTextSize(textSize.toFloat())
        wv_month!!.setTextSize(textSize.toFloat())
        wv_year!!.setTextSize(textSize.toFloat())
        wv_day2!!.setTextSize(textSize.toFloat())
        wv_month2!!.setTextSize(textSize.toFloat())
        wv_year2!!.setTextSize(textSize.toFloat())
    }

    fun setLabels(label_year: String?, label_month: String?, label_day: String?) {
        if (label_year != null) {
            wv_year!!.setLabel(label_year)
            wv_year2!!.setLabel(label_year)
        } else {
            wv_year!!.setLabel("年")
            wv_year2!!.setLabel("年")
        }
        if (label_month != null) {
            wv_month!!.setLabel(label_month)
            wv_month2!!.setLabel(label_month)
        } else {
            wv_month!!.setLabel("月")
            wv_month2!!.setLabel("月")
        }
        if (label_day != null) {
            wv_day!!.setLabel(label_day)
            wv_day2!!.setLabel(label_day)
        } else {
            wv_day!!.setLabel("日")
            wv_day2!!.setLabel("日")
        }
    }

    fun setTextXOffset(x_offset_year: Int, x_offset_month: Int, x_offset_day: Int) {
        wv_year!!.setTextXOffset(x_offset_year)
        wv_month!!.setTextXOffset(x_offset_month)
        wv_day!!.setTextXOffset(x_offset_day)
        wv_year2!!.setTextXOffset(x_offset_year)
        wv_month2!!.setTextXOffset(x_offset_month)
        wv_day2!!.setTextXOffset(x_offset_day)
    }

    /**
     * 設(shè)置是否循環(huán)滾動(dòng)
     *
     * @param cyclic
     */
    fun setCyclic(cyclic: Boolean) {
        wv_year!!.setCyclic(cyclic)
        wv_month!!.setCyclic(cyclic)
        wv_day!!.setCyclic(cyclic)
        wv_year2!!.setCyclic(cyclic)
        wv_month2!!.setCyclic(cyclic)
        wv_day2!!.setCyclic(cyclic)
    }

    val time: String
        get() {
            val sb = StringBuilder()
            if (currentYear == startYear) {
                if (wv_month!!.currentItem + startMonth == startMonth) {
                    sb.append(wv_year!!.currentItem + startYear).append("-")
                        .append(wv_month!!.currentItem + startMonth).append("-")
                        .append(wv_day!!.currentItem + startDay)
                } else {
                    sb.append(wv_year!!.currentItem + startYear).append("-")
                        .append(wv_month!!.currentItem + startMonth).append("-")
                        .append(wv_day!!.currentItem + 1)
                }
            } else {
                sb.append(wv_year!!.currentItem + startYear).append("-")
                    .append(wv_month!!.currentItem + 1).append("-")
                    .append(wv_day!!.currentItem + 1)
            }
            return sb.toString()
        }
    val time2: String
        get() {
            val sb = StringBuilder()
            if (currentYear == startYear) {
                if (wv_month2!!.currentItem + startMonth == startMonth) {
                    sb.append(wv_year2!!.currentItem + startYear).append("-")
                        .append(wv_month2!!.currentItem + startMonth).append("-")
                        .append(wv_day2!!.currentItem + startDay)
                } else {
                    sb.append(wv_year2!!.currentItem + startYear).append("-")
                        .append(wv_month2!!.currentItem + startMonth).append("-")
                        .append(wv_day2!!.currentItem + 1)
                }
            } else {
                sb.append(wv_year2!!.currentItem + startYear).append("-")
                    .append(wv_month2!!.currentItem + 1).append("-")
                    .append(wv_day2!!.currentItem + 1)
            }
            return sb.toString()
        }

    /**
     * 設(shè)置間距倍數(shù),但是只能在1.0-4.0f之間
     *
     * @param lineSpacingMultiplier
     */
    fun setLineSpacingMultiplier(lineSpacingMultiplier: Float) {
        wv_day!!.setLineSpacingMultiplier(lineSpacingMultiplier)
        wv_month!!.setLineSpacingMultiplier(lineSpacingMultiplier)
        wv_year!!.setLineSpacingMultiplier(lineSpacingMultiplier)
        wv_day2!!.setLineSpacingMultiplier(lineSpacingMultiplier)
        wv_month2!!.setLineSpacingMultiplier(lineSpacingMultiplier)
        wv_year2!!.setLineSpacingMultiplier(lineSpacingMultiplier)
    }

    /**
     * 設(shè)置分割線(xiàn)的顏色
     *
     * @param dividerColor
     */
    fun setDividerColor(dividerColor: Int) {
        wv_day!!.setDividerColor(dividerColor)
        wv_month!!.setDividerColor(dividerColor)
        wv_year!!.setDividerColor(dividerColor)
        wv_day2!!.setDividerColor(dividerColor)
        wv_month2!!.setDividerColor(dividerColor)
        wv_year2!!.setDividerColor(dividerColor)
    }

    /**
     * 設(shè)置分割線(xiàn)的類(lèi)型
     *
     * @param dividerType
     */
    fun setDividerType(dividerType: DividerType?) {
        wv_day!!.setDividerType(dividerType)
        wv_month!!.setDividerType(dividerType)
        wv_year!!.setDividerType(dividerType)
        wv_day2!!.setDividerType(dividerType)
        wv_month2!!.setDividerType(dividerType)
        wv_year2!!.setDividerType(dividerType)
    }

    /**
     * 設(shè)置分割線(xiàn)之間的文字的顏色
     *
     * @param textColorCenter
     */
    fun setTextColorCenter(textColorCenter: Int) {
        wv_day!!.setTextColorCenter(textColorCenter)
        wv_month!!.setTextColorCenter(textColorCenter)
        wv_year!!.setTextColorCenter(textColorCenter)
        wv_day2!!.setTextColorCenter(textColorCenter)
        wv_month2!!.setTextColorCenter(textColorCenter)
        wv_year2!!.setTextColorCenter(textColorCenter)
    }

    /**
     * 設(shè)置分割線(xiàn)以外文字的顏色
     *
     * @param textColorOut
     */
    fun setTextColorOut(textColorOut: Int) {
        wv_day!!.setTextColorOut(textColorOut)
        wv_month!!.setTextColorOut(textColorOut)
        wv_year!!.setTextColorOut(textColorOut)
        wv_day2!!.setTextColorOut(textColorOut)
        wv_month2!!.setTextColorOut(textColorOut)
        wv_year2!!.setTextColorOut(textColorOut)
    }

    /**
     * @param isCenterLabel 是否只顯示中間選中項(xiàng)的
     */
    fun isCenterLabel(isCenterLabel: Boolean) {
        wv_day!!.isCenterLabel(isCenterLabel)
        wv_month!!.isCenterLabel(isCenterLabel)
        wv_year!!.isCenterLabel(isCenterLabel)
        wv_day2!!.isCenterLabel(isCenterLabel)
        wv_month2!!.isCenterLabel(isCenterLabel)
        wv_year2!!.isCenterLabel(isCenterLabel)
    }

    fun setSelectChangeCallback(mSelectChangeCallback: ISelectTimeCallback?) {
        this.mSelectChangeCallback = mSelectChangeCallback
    }

    fun setItemsVisible(itemsVisibleCount: Int) {
        wv_day!!.setItemsVisibleCount(itemsVisibleCount)
        wv_month!!.setItemsVisibleCount(itemsVisibleCount)
        wv_year!!.setItemsVisibleCount(itemsVisibleCount)
        wv_day2!!.setItemsVisibleCount(itemsVisibleCount)
        wv_month2!!.setItemsVisibleCount(itemsVisibleCount)
        wv_year2!!.setItemsVisibleCount(itemsVisibleCount)
    }

    fun setAlphaGradient(isAlphaGradient: Boolean) {
        wv_day!!.setAlphaGradient(isAlphaGradient)
        wv_month!!.setAlphaGradient(isAlphaGradient)
        wv_year!!.setAlphaGradient(isAlphaGradient)
        wv_day2!!.setAlphaGradient(isAlphaGradient)
        wv_month2!!.setAlphaGradient(isAlphaGradient)
        wv_year2!!.setAlphaGradient(isAlphaGradient)
    }

    fun setRangDate(startDate: Calendar?, endDate: Calendar?) {
        if (startDate == null && endDate != null) {
            val year = endDate[Calendar.YEAR]
            val month = endDate[Calendar.MONTH] + 1
            val day = endDate[Calendar.DAY_OF_MONTH]
            if (year > startYear) {
                endYear = year
                endMonth = month
                endDay = day
            } else if (year == startYear) {
                if (month > startMonth) {
                    endYear = year
                    endMonth = month
                    endDay = day
                } else if (month == startMonth) {
                    if (day > startDay) {
                        endYear = year
                        endMonth = month
                        endDay = day
                    }
                }
            }
        } else if (startDate != null && endDate == null) {
            val year = startDate[Calendar.YEAR]
            val month = startDate[Calendar.MONTH] + 1
            val day = startDate[Calendar.DAY_OF_MONTH]
            if (year < endYear) {
                startMonth = month
                startDay = day
                startYear = year
            } else if (year == endYear) {
                if (month < endMonth) {
                    startMonth = month
                    startDay = day
                    startYear = year
                } else if (month == endMonth) {
                    if (day < endDay) {
                        startMonth = month
                        startDay = day
                        startYear = year
                    }
                }
            }
        } else if (startDate != null && endDate != null) {
            startYear = startDate[Calendar.YEAR]
            endYear = endDate[Calendar.YEAR]
            startMonth = startDate[Calendar.MONTH] + 1
            endMonth = endDate[Calendar.MONTH] + 1
            startDay = startDate[Calendar.DAY_OF_MONTH]
            endDay = endDate[Calendar.DAY_OF_MONTH]
        }
    }

    companion object {
        var dateFormat: DateFormat = SimpleDateFormat("yyyy-MM-dd")
        private const val DEFAULT_START_YEAR = 1900
        private const val DEFAULT_END_YEAR = 2100
        private const val DEFAULT_START_MONTH = 1
        private const val DEFAULT_END_MONTH = 12
        private const val DEFAULT_START_DAY = 1
        private const val DEFAULT_END_DAY = 31
    }
}

2.改造布局pickerview_time2

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/rv_topbar"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="@color/pickerview_bg_topbar">

        <Button
                android:id="@+id/btnCancel"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:background="@android:color/transparent"
                android:gravity="left|center_vertical"
                android:paddingLeft="@dimen/pickerview_topbar_padding"
                android:text="@string/pickerview_cancel"
                android:textAllCaps="false"
                android:textColor="@drawable/selector_pickerview_btn"
                android:textSize="@dimen/pickerview_topbar_btn_textsize" />

        <TextView
                android:id="@+id/tvTitle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toLeftOf="@+id/btnSubmit"
                android:layout_toRightOf="@+id/btnCancel"
                android:gravity="center"
                android:textColor="@color/pickerview_topbar_title"
                android:textSize="@dimen/pickerview_topbar_title_textsize" />

        <Button
                android:id="@id/btnSubmit"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_alignParentRight="true"
                android:background="@android:color/transparent"
                android:gravity="right|center_vertical"
                android:paddingRight="@dimen/pickerview_topbar_padding"
                android:text="@string/pickerview_submit"
                android:textAllCaps="false"
                android:textColor="@drawable/selector_pickerview_btn"
                android:textSize="@dimen/pickerview_topbar_btn_textsize" />
    </RelativeLayout>

    <LinearLayout
            android:padding="8dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white"
            android:orientation="horizontal">
        <LinearLayout
                android:id="@+id/timepicker"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="match_parent"
                android:background="@android:color/white"
                android:gravity="center"
                android:minHeight="180dp"
                android:orientation="horizontal">

            <com.contrarywind.view.WheelView
                    android:id="@+id/year"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1.1" />

            <com.contrarywind.view.WheelView
                    android:id="@+id/month"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1" />

            <com.contrarywind.view.WheelView
                    android:id="@+id/day"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1" />

        </LinearLayout>
        <View
                android:background="#cccccc"
                android:layout_width="0.5dp"
                android:layout_height="180dp"
                />
        <LinearLayout
                android:id="@+id/timepicker2"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="match_parent"
                android:background="@android:color/white"
                android:gravity="center"
                android:minHeight="180dp"
                android:orientation="horizontal">

            <com.contrarywind.view.WheelView
                    android:id="@+id/year2"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1.1" />

            <com.contrarywind.view.WheelView
                    android:id="@+id/month2"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1" />

            <com.contrarywind.view.WheelView
                    android:id="@+id/day2"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1" />

        </LinearLayout>
    </LinearLayout>



</LinearLayout>

3.使用:調(diào)用showPicker()方法即可

    private fun showPicker(){
        val selectedDate = Calendar.getInstance()
        val startDate = Calendar.getInstance()
        val endDate = Calendar.getInstance()
        startDate.set(2013,0,1)
        endDate.set(2099,11,31)
        pvTime = TimePickerBuilder2(this) { date, date2 -> //選中事件回調(diào)
            Log.e(TAG,getTime(date)+"到"+getTime(date2))
        }
            .setType(booleanArrayOf(true, true, true, false, false, false)) // 默認(rèn)全部顯示
            .setCancelText("取消") //取消按鈕文字
            .setSubmitText("確定") //確認(rèn)按鈕文字
            .setContentTextSize(18) //滾輪文字大小
            .setTitleSize(20) //標(biāo)題文字大小
            .setTitleText("開(kāi)始結(jié)束時(shí)間選擇") //標(biāo)題文字
            .setOutSideCancelable(false) //點(diǎn)擊屏幕,點(diǎn)在控件外部范圍時(shí)地粪,是否取消顯示
            .isCyclic(false) //是否循環(huán)滾動(dòng)
            .setDate(selectedDate) // 如果不設(shè)置的話(huà)剃诅,默認(rèn)是系統(tǒng)時(shí)間*/
            .setRangDate(startDate, endDate) //起始終止年月日設(shè)定
            .setLabel("年", "月", "日") //默認(rèn)設(shè)置為年月日時(shí)分秒
            .isCenterLabel(false) //是否只顯示中間選中項(xiàng)的label文字,false則每項(xiàng)item全部都帶有l(wèi)abel驶忌。
            .isDialog(true) //是否顯示為對(duì)話(huà)框樣式
            .build()
        pvTime.show()
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市笑跛,隨后出現(xiàn)的幾起案子付魔,更是在濱河造成了極大的恐慌,老刑警劉巖飞蹂,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件几苍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡陈哑,警方通過(guò)查閱死者的電腦和手機(jī)妻坝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)伸眶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人刽宪,你說(shuō)我怎么就攤上這事厘贼。” “怎么了圣拄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵嘴秸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我庇谆,道長(zhǎng)岳掐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任饭耳,我火速辦了婚禮串述,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寞肖。我一直安慰自己纲酗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布逝淹。 她就那樣靜靜地躺著耕姊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栅葡。 梳的紋絲不亂的頭發(fā)上茉兰,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音欣簇,去河邊找鬼规脸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛熊咽,可吹牛的內(nèi)容都是我干的莫鸭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼横殴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼被因!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起衫仑,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤梨与,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后文狱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體粥鞋,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年瞄崇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呻粹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壕曼。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖等浊,靈堂內(nèi)的尸體忽然破棺而出腮郊,到底是詐尸還是另有隱情,我是刑警寧澤凿掂,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布伴榔,位于F島的核電站,受9級(jí)特大地震影響庄萎,放射性物質(zhì)發(fā)生泄漏踪少。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一糠涛、第九天 我趴在偏房一處隱蔽的房頂上張望援奢。 院中可真熱鬧,春花似錦忍捡、人聲如沸集漾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)具篇。三九已至,卻和暖如春凌埂,著一層夾襖步出監(jiān)牢的瞬間驱显,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工瞳抓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留埃疫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓孩哑,卻偏偏與公主長(zhǎng)得像栓霜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子横蜒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容