Unity日历组件制作

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using Object = UnityEngine.Object;

//日期类型
public enum E_CalendarType
{
Day,
Month,
Year
}

//语言类型
public enum E_DisplayType
{
Standard,
Chinese
}

public class Clendar : UIBehaviour
{

private DateTime m_selectDateTime = DateTime.Today;  //今天日期
private DateTime m_updateDateTime = DateTime.Today;

private readonly CalendarData m_calendarData = new CalendarData();  //日期计算类
private Transform m_TransForm = null;

[HideInInspector]
public E_CalendarType CalendarType = E_CalendarType.Day;//日期类型
[HideInInspector]
public E_DisplayType DisplayType = E_DisplayType.Chinese;//语言类型

private Text _timeButtonText = null;
private GameObject _weekGameObject = null; //控件 周
private GameObject _dayGameObject = null;  //控件 天
private GameObject _monthGameObject = null;  //控件 月
private readonly List<DMY> _daysPool = new List<DMY>(); //列表 天
private readonly List<DMY> _monthYearPool = new List<DMY>(); //列表 月


protected override void Awake()
{
    m_TransForm = transform;
    _timeButtonText = m_TransForm.Find("Title/TimeButton/Text").GetComponent<Text>();
    _weekGameObject = m_TransForm.Find("Container/Weeks").gameObject;
    _dayGameObject = m_TransForm.Find("Container/Days").gameObject;
    _monthGameObject = m_TransForm.Find("Container/Months").gameObject;

    var weekPrefab = m_TransForm.Find("Container/Weeks/WeekTemplate").gameObject; //预制体 周
    var dayPrefab = m_TransForm.Find("Container/Days/DayTemplate").gameObject; //预制体 天
    var monthPrefab = m_TransForm.Find("Container/Months/MonthTemplate").gameObject; //预制体 月

    //初始化生成日期
    GenerateWeeks(weekPrefab, _weekGameObject.transform);
    GenerateDays(dayPrefab, _dayGameObject.transform);
    GenerateMonths(monthPrefab, _monthGameObject.transform);

    //点击事件绑定
    m_TransForm.Find("Title/TimeButton").GetComponent<Button>().onClick.AddListener(OnTimeButtonClick);
    m_TransForm.Find("Title/NextButton").GetComponent<Button>().onClick.AddListener(OnNextButtonClick);
    m_TransForm.Find("Title/LastButton").GetComponent<Button>().onClick.AddListener(OnLastButtonClick);

    Refresh();
}

//选择日期按钮
private void OnTimeButtonClick()
{
    if (CalendarType == E_CalendarType.Month)
        CalendarType = E_CalendarType.Year;
    if(CalendarType == E_CalendarType.Day)
    {
        CalendarType = E_CalendarType.Month;
        calendarTypeChange(false);
    }
    Refresh();
}

//下一页
private void OnNextButtonClick()
{
    if (CalendarType == E_CalendarType.Day)
    {
        m_selectDateTime = m_selectDateTime.AddMonths(1);
        m_updateDateTime = m_updateDateTime.AddMonths(1);
    }
    else if (CalendarType == E_CalendarType.Month)
    {
        m_selectDateTime = m_selectDateTime.AddYears(1);
        m_updateDateTime = m_updateDateTime.AddYears(1);
    }
    else
    {
        m_selectDateTime = m_selectDateTime.AddYears(12);
        m_updateDateTime = m_updateDateTime.AddYears(12);
    }
    Refresh();
}

//上一页
private void OnLastButtonClick()
{
    if (CalendarType == E_CalendarType.Day)
    {
        m_selectDateTime = m_selectDateTime.AddMonths(-1);
        m_updateDateTime = m_updateDateTime.AddMonths(-1);
    }
    else if (CalendarType == E_CalendarType.Month)
    {
        m_selectDateTime = m_selectDateTime.AddYears(-1);
        m_updateDateTime = m_updateDateTime.AddMonths(-1);
    }
    else
    {
        m_selectDateTime = m_selectDateTime.AddYears(-12);
        m_updateDateTime = m_updateDateTime.AddYears(-12);
    }
    Refresh();
}


//周的生成
private void GenerateWeeks(GameObject weekPrefab, Transform parent)
{
    for (int i = 0; i < 7; i++)
    {
        GameObject week = prefabGenerate(weekPrefab, parent);
        week.GetComponent<Text>().text = GetWeekName(i.ToString());
    }
    Destroy(weekPrefab);
}

//日的生成
private void GenerateDays(GameObject dayPrefab, Transform parent)
{
    for (int i = 0; i < 42; i++)
    {
        GameObject day = prefabGenerate(dayPrefab, parent);
        DMY dmy = day.AddComponent<DMY>();
        day.GetComponent<Button>().onClick.AddListener(() =>
        {
            m_updateDateTime = dmy.DateTime;
            Refresh();
        });
        _daysPool.Add(dmy);
    }
    Destroy(dayPrefab);
}

//月的生成
private void GenerateMonths(GameObject monthPrefab, Transform parent)
{
    for(int i = 0; i < 12; i++)
    {
        GameObject month = prefabGenerate(monthPrefab, parent);
        DMY dmy = month.AddComponent<DMY>();
        dmy.GetComponent<Button>().onClick.AddListener(() =>
        {
            m_updateDateTime = dmy.DateTime;
            if(CalendarType == E_CalendarType.Month)
            {
                calendarTypeChange(true);
                CalendarType = E_CalendarType.Day;
            }
            if(CalendarType == E_CalendarType.Year)
            {
                CalendarType = E_CalendarType.Month;
            }
            Refresh();
        });
        _monthYearPool.Add(dmy);
    }
    Destroy(monthPrefab);

}

//预制体生成
private GameObject prefabGenerate(GameObject prefab, Transform parent)
{
    GameObject go = Object.Instantiate(prefab);
    go.transform.SetParent(parent);
    go.transform.localScale = Vector3.one;
    return go;
}

//获取周名称
private string GetWeekName(string weekName)
{
    switch (DisplayType)
    {
        case E_DisplayType.Standard:
            switch (weekName)
            {
                case "0":
                    return "SunDay";
                case "1":
                    return "Monday";
                case "2":
                    return "Tuesday";
                case "3":
                    return "Wendesday";
                case "4":
                    return "Thursday";
                case "5":
                    return "Friday";
                case "6":
                    return "Saturfay";
                default:
                    return "";
            }
        case E_DisplayType.Chinese:
            switch (weekName)
            {
                case "0":
                    return "日";
                case "1":
                    return "一";
                case "2":
                    return "二";
                case "3":
                    return "三";
                case "4":
                    return "四";
                case "5":
                    return "五";
                case "6":
                    return "六";
                default:
                    return "";
            }              
        default:
            return "";

    }

}

//改变日期类型
private void calendarTypeChange(bool isDays)
{
    _weekGameObject.SetActive(isDays);
    _dayGameObject.SetActive(isDays);
    _monthGameObject.SetActive(!isDays);
}

//刷新日期数据
private void Refresh()
{
    RefreshTimeButtonContent();
    RefreshCalendar();
}

//更新日期列表
private void RefreshCalendar()
{
    if (CalendarType == E_CalendarType.Day) RefreshDays(m_calendarData.Days(m_selectDateTime));
    else if (CalendarType == E_CalendarType.Month) RefreshMonths(m_calendarData.Months(m_selectDateTime));
    else RefreshYears(m_calendarData.Years(m_selectDateTime));
}

//刷新时间按钮的时间数据
private void RefreshTimeButtonContent()
{
    switch (CalendarType)
    {
        case E_CalendarType.Day:
            if (DisplayType == E_DisplayType.Standard) _timeButtonText.text = m_updateDateTime.ToShortDateString();
            else _timeButtonText.text = m_updateDateTime.Year + "年" + m_updateDateTime.Month + "月" + m_updateDateTime.Day + "日";
            break;
        case E_CalendarType.Month:
            if (DisplayType == E_DisplayType.Standard) _timeButtonText.text = m_updateDateTime.Year + "/" + m_updateDateTime.Month;
            else _timeButtonText.text = m_updateDateTime.Year + "年" + m_updateDateTime.Month + "月";
            break;
        case E_CalendarType.Year:
            if (DisplayType == E_DisplayType.Standard) _timeButtonText.text = m_updateDateTime.Year.ToString();
            else _timeButtonText.text = m_updateDateTime.Year.ToString();
            break;
    }
}

//更新天
private void RefreshDays(List<DateTime> dateTimes)
{
    for(int i = 0; i < _daysPool.Count; i++)
    {
        var fontColor = Color.green;
        if (dateTimes[i].Month != m_selectDateTime.Month)
        {
            fontColor = Color.white;          
        }
        _daysPool[i].SetDay(dateTimes[i], DisplayType, fontColor);
    }
}

//更新月
private void RefreshMonths(List<DateTime> dateTimes)
{
    for(int i = 0; i < _monthYearPool.Count; i++)
    {
        _monthYearPool[i].SetMonth(dateTimes[i], DisplayType);
    }
}

//更新年
private void RefreshYears(List<DateTime> dateTimes)
{
    for(int i = 0; i < _monthYearPool.Count; i++)
    {
        _monthYearPool[i].SetYear(dateTimes[i], DisplayType);
    }
}

public class CalendarData
{

    //计算出需要显示的42天的DateTime值
    public List<DateTime> Days(DateTime month)
    {
        List<DateTime> days = new List<DateTime>();
        DateTime firstDay = new DateTime(month.Year, month.Month, 1);
        DayOfWeek week = firstDay.DayOfWeek;
        int lastMonthDays = (int)week;
        if (lastMonthDays.Equals(0))
            lastMonthDays = 7;
        for (int i = lastMonthDays; i > 0; i--)
        {
            days.Add(firstDay.AddDays(-i));
        }
        for (int i = 0; i < 42 - lastMonthDays; i++)
        {
            days.Add(firstDay.AddDays(i));
        }
        return days;
    }

    //计算出12个月的DateTime的值
    public List<DateTime> Months(DateTime year)
    {
        List<DateTime> months = new List<DateTime>();
        DateTime fiestMonth = new DateTime(year.Year, 1, 1);
        months.Add(fiestMonth);
        for (int i = 1; i < 12; i++)
        {
            months.Add(fiestMonth.AddMonths(i));
        }
        return months;
    }

    public List<DateTime> Years(DateTime year)
    {
        List<DateTime> years = new List<DateTime>();
        for (int i = 5; i > 0; i--)
        {
            years.Add(year.AddYears(-i));
        }
        for (int i = 0; i < 7; i++)
        {
            years.Add(year.AddYears(i));
        }
        return years;
    }
}


public class DMY : UIBehaviour
{
    public DateTime DateTime { get; set; }

    private Text _text = null;

    protected override void Awake()
    {
        _text = transform.Find("Text").GetComponent<Text>();
    }

    public void SetDay(DateTime datetime, E_DisplayType displayType, Color fontColor)
    {
        Debug.Log("时间:" + datetime + "/n");
        DateTime = datetime;
        _text.text = datetime.Day.ToString();
        _text.color = fontColor;
    }

    public void SetMonth(DateTime datetime, E_DisplayType displayType)
    {
        DateTime = datetime;
        _text.text = getMonthString(datetime.Month.ToString(), displayType);
    }

    public void SetYear(DateTime datetime, E_DisplayType displayType)
    {
        DateTime = datetime;
        _text.text = datetime.Year.ToString();
    }

    private string getMonthString(string month, E_DisplayType displayType)
    {
        switch (displayType)
        {
            case E_DisplayType.Standard:
                switch (month)
                {
                    case "1":
                        return "Jan";
                    case "2":
                        return "Feb";
                    case "3":
                        return "Mar";
                    case "4":
                        return "Apr";
                    case "5":
                        return "May";
                    case "6":
                        return "Jun";
                    case "7":
                        return "Jul";
                    case "8":
                        return "Aug";
                    case "9":
                        return "Sep";
                    case "10":
                        return "Oct";
                    case "11":
                        return "Nov";
                    case "12":
                        return "Dec";
                    default:
                        return "";
                }
            case E_DisplayType.Chinese:
                switch (month)
                {
                    case "1":
                        return "一月";
                    case "2":
                        return "二月";
                    case "3":
                        return "三月";
                    case "4":
                        return "四月";
                    case "5":
                        return "五月";
                    case "6":
                        return "六月";
                    case "7":
                        return "七月";
                    case "8":
                        return "八月";
                    case "9":
                        return "九月";
                    case "10":
                        return "十月";
                    case "11":
                        return "十一月";
                    case "12":
                        return "十二月";
                    default:
                        return "";
                }
            default:
                return "";
        }
    }
}

}

Unity版本 2018.3.8
工程地址: https://download.csdn.net/download/XiFeng__/12109465在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值