Unity中日历面板

20 篇文章 0 订阅
1 篇文章 0 订阅
using UnityEngine;
using System.Collections;
using System;
using UnityEngine.UI;
using System.Collections.Generic;

public enum CalendarType
{
    Day,
    Month,
    Year
}

public class Calendar : MonoBehaviour {
    [Header("点击日期是是否默认关掉Calendar面板")]
    public bool OnClickDayIsDefaultClose = false;

    //年月日 点击回调
    public Action<DateTime> OnClickDay;
    public Action<DateTime> OnClickMonth;
    public Action<DateTime> OnClickYear;

    private DateTime m_selectDT = DateTime.Today;
    private CalendarType m_calendarType = CalendarType.Day;
    //当前选择的日期
    private DateTime u_selectDT = DateTime.Today;

    private UIButton btnLast = null;
    private UIButton btnNext = null;
    private UIButton btnTime = null;
    private UILabel textTime = null;

    private GameObject dayContent = null;
    private GameObject weekContent = null;
    private GameObject monthContent = null;

    private UIGrid dayGrid = null;
    private UIGrid weekGrid = null;
    private UIGrid monthGrid = null;

    private readonly List<DMY> _daysPool = new List<DMY>();
    //private readonly List<GameObject> _daysPool = new List<GameObject>();
    private readonly List<DMY> _monthYearPool = new List<DMY>();
    private readonly CalendarData m_calendarData = new CalendarData();

    private void Awake()
    {
        btnLast = transform.Find("Title/BtnLast").GetComponent<UIButton>();
        btnNext = transform.Find("Title/BtnNext").GetComponent<UIButton>();
        btnTime = transform.Find("Title/BtnTime").GetComponent<UIButton>();
        textTime = transform.Find("Title/BtnTime").GetComponent<UILabel>();

        dayContent = transform.Find("Date/Days").gameObject;
        weekContent = transform.Find("Date/Weeks").gameObject;
        monthContent = transform.Find("Date/Months").gameObject;
        var dayPrefab = Resources.Load("CalendarPrefabs/DayTemplate") as GameObject;
        var weekPrefab = Resources.Load("CalendarPrefabs/WeekTemplate") as GameObject;
        var monthPrefab = Resources.Load("CalendarPrefabs/MonthTemplate") as GameObject;
        dayGrid = dayContent.GetComponent<UIGrid>();
        weekGrid = weekContent.GetComponent<UIGrid>();
        monthGrid = monthContent.GetComponent<UIGrid>();
        DayPoolCreate(dayPrefab, dayContent);
        WeekPoolCreate(weekPrefab, weekContent);
        MonthPoolCreate(monthPrefab, monthContent);
    }
    private void Start()
    {
        UIEventListener.Get(btnLast.gameObject).onClick += OnClickBtnLast;
        UIEventListener.Get(btnTime.gameObject).onClick += OnClickBtnTime;
        UIEventListener.Get(btnNext.gameObject).onClick += OnClickBtnNext;
        monthContent.gameObject.SetActive(false);
        Refresh();
    }

    private void OnClickBtnLast(GameObject go)
    {
        if (m_calendarType == CalendarType.Day)
            m_selectDT = m_selectDT.AddMonths(-1);
        else if (m_calendarType == CalendarType.Month)
            m_selectDT = m_selectDT.AddYears(-1);
        else
            m_selectDT = m_selectDT.AddYears(-12);
        Refresh();
    }

    private void OnClickBtnTime(GameObject go)
    {
        if (m_calendarType == CalendarType.Month)
            m_calendarType = CalendarType.Year;
        if (m_calendarType == CalendarType.Day)
        {
            m_calendarType = CalendarType.Month;
            CalendarTypeChange(false);
        }
        Refresh();
    }

    private void OnClickBtnNext(GameObject go)
    {
        if (m_calendarType == CalendarType.Day)
            m_selectDT = m_selectDT.AddMonths(1);
        else if (m_calendarType == CalendarType.Month)
            m_selectDT = m_selectDT.AddYears(1);
        else
            m_selectDT = m_selectDT.AddYears(12);
        Refresh();
    }

    /// <summary>
    /// 创建日期池子
    /// </summary>
    /// <param name="dayPrefab">预制</param>
    /// <param name="parent">父节点</param>
    private void DayPoolCreate(GameObject dayPrefab, GameObject parent)
    {
        for (int i = 0; i < 42; i++)
        {
            GameObject day = CreatePrefabs(dayPrefab, parent);
            DMY dmy = day.AddComponent<DMY>();
            UIButton click = day.GetComponent<UIButton>();
            dmy.OnClickCallBack += dayTemplate_CallBack;
            _daysPool.Add(dmy);
            //_daysPool.Add(day);
        }
        dayGrid.repositionNow = true;
    }
    /// <summary>
    /// 创建周
    /// </summary>
    /// <param name="weekPrefab"></param>
    /// <param name="parent"></param>
    private void WeekPoolCreate(GameObject weekPrefab, GameObject parent)
    {
        for (int i = 0; i < 7; i++)
        {
            GameObject week = CreatePrefabs(weekPrefab, parent);
            week.GetComponent<UILabel>().text = GetWeekName(i.ToString());
        }
        weekGrid.repositionNow = true;
    }
    /// <summary>
    /// 月份
    /// </summary>
    /// <param name="monthPrefab"></param>
    /// <param name="parent"></param>
    private void MonthPoolCreate(GameObject monthPrefab, GameObject parent)
    {
        for (int i = 0; i < 12; i++)
        {
            GameObject month = CreatePrefabs(monthPrefab, parent);
            DMY dmy = month.AddComponent<DMY>();
            dmy.OnClickCallBack += monthTemplate_CallBack;
            _monthYearPool.Add(dmy);
        }
        monthGrid.repositionNow = true;
    }
    /// <summary>
    /// 日期按钮回调
    /// </summary>
    /// <param name="dateTime"></param>
    private void dayTemplate_CallBack(DateTime dateTime)
    {
        m_selectDT = dateTime;
        if (OnClickDay != null)
        {
            OnClickDay.Invoke(dateTime);
        }
        Refresh();
    }
    /// <summary>
    /// 月份 年份点击回调
    /// </summary>
    /// <param name="dateTime"></param>
    private void monthTemplate_CallBack(DateTime dateTime)
    {
        m_selectDT = dateTime;
        if (m_calendarType == CalendarType.Month)
        {
            m_calendarType = CalendarType.Day;
            CalendarTypeChange(true);
            if (OnClickMonth != null)
            {
                OnClickMonth.Invoke(dateTime);
            }
        }
        if (m_calendarType == CalendarType.Year)
        {
            m_calendarType = CalendarType.Month;
            if (OnClickYear != null)
            {
                OnClickYear.Invoke(dateTime);
            }
        }
        Refresh();
    }
    /// <summary>
    /// 切换当前选择类型
    /// </summary>
    /// <param name="isDays"></param>
    private void CalendarTypeChange(bool isDays)
    {
        dayContent.SetActive(isDays);
        weekContent.SetActive(isDays);
        monthContent.SetActive(!isDays);
    }

    /// <summary>
    /// 创建一个预制
    /// </summary>
    /// <param name="prefab"></param>
    /// <param name="parent"></param>
    /// <returns></returns>
    private GameObject CreatePrefabs(GameObject prefab, GameObject parent)
    {
        GameObject go = NGUITools.AddChild(parent, prefab);
        go.transform.localScale = Vector3.one;
        return go;
    }
    /// <summary>
    /// 获取并设置周数据
    /// </summary>
    /// <param name="weekName"></param>
    /// <returns></returns>
    private string GetWeekName(string weekName)
    {
        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 "";
        }
    }

    private void Refresh()
    {
        RefreshCalendar();
        RefreshTimeButtonContent();
    }
    /// <summary>
    /// 刷新日期显示文本框
    /// </summary>
    private void RefreshTimeButtonContent()
    {
        switch (m_calendarType)
        {
            case CalendarType.Day:
                textTime.text = m_selectDT.Year + "年" + m_selectDT.Month + "月" + m_selectDT.Day + "日";
                break;
            case CalendarType.Month:
                textTime.text = m_selectDT.Year + "年" + m_selectDT.Month + "月";
                break;
            case CalendarType.Year:
                textTime.text = m_selectDT.Year + "年";
                break;
            default:
                break;
        }
    }
    /// <summary>
    /// 刷新日历面板显示
    /// </summary>
    private void RefreshCalendar()
    {
        if (m_calendarType == CalendarType.Day) RefreshDays(m_calendarData.Days(m_selectDT));
        else if (m_calendarType == CalendarType.Month) RefreshMonths(m_calendarData.Months(m_selectDT));
        else RefreshYears(m_calendarData.Years(m_selectDT));
    }
    private void RefreshDays(List<DateTime> dateTimes)
    {
        for (int i = 0; i < _daysPool.Count; i++)
        {
            var fontColor = Color.black;
            if (dateTimes[i].Month != m_selectDT.Month)
                fontColor = Color.gray;
            //_daysPool[i].GetComponent<UISprite>().spriteName = "btn_WhiteBG";
            if (DateTime.Compare(dateTimes[i], u_selectDT) == 0)
            {
                //_daysPool[i].GetComponent<UISprite>().spriteName = "btn_WhiteBG";
                fontColor = Color.green;
            }
            //_daysPool[i].GetComponent<DMY>().SetDay(dateTimes[i], fontColor);
            _daysPool[i].SetDay(dateTimes[i], fontColor);
        }
    }
    private void RefreshMonths(List<DateTime> dateTimes)
    {
        for (int i = 0; i < _monthYearPool.Count; i++)
            _monthYearPool[i].SetMonth(dateTimes[i]);
    }
    private void RefreshYears(List<DateTime> dateTimes)
    {
        for (int i = 0; i < _monthYearPool.Count; i++)
            _monthYearPool[i].SetYear(dateTimes[i]);
    }

    public void ShowCalendar()
    {
        u_selectDT = DateTime.Today;
        m_selectDT = DateTime.Today;
        m_calendarType = CalendarType.Day;
        Refresh();
        CalendarTypeChange(true);
        if (!gameObject.activeInHierarchy)
        {
            gameObject.SetActive(true);

        }
    }
    public void ShowCalendar(DateTime date)
    {
        u_selectDT = date;
        m_selectDT = date;
        m_calendarType = CalendarType.Day;
        Refresh();
        CalendarTypeChange(true);
        if (!gameObject.activeInHierarchy)
        {
            gameObject.SetActive(true);

        }
    }
    public void HideCalendar()
    {
        m_selectDT = DateTime.Today;
        m_calendarType = CalendarType.Day;
        Refresh();
        CalendarTypeChange(true);
        if (gameObject.activeInHierarchy)
        {
            gameObject.SetActive(false);
        }
    }
    /// <summary>
    /// 获取格式化的时间字符串(2018-08-01)
    /// </summary>
    /// <param name="date"></param>
    /// <returns></returns>
    public string GetFormatDate(DateTime date)
    {
        string year = date.Year.ToString();
        string month = date.Month.ToString();
        string day = date.Day.ToString();
        if (int.Parse(month) < 10)
        {
            month = string.Format("{0}{1}", 0, month);
        }
        if (int.Parse(day) < 10)
        {
            day = string.Format("{0}{1}", 0, day);
        }
        //return date.Year + "-" + date.Month + "-" + date.Day;
        return string.Format("{0}-{1}-{2}", year, month, day);
    }
}

public class DMY : MonoBehaviour
{
    public DateTime DateTime { get; set; }
    public Action<DateTime> OnClickCallBack;
    private UILabel _text = null;
    private UIButton btnClick = null;
    private void Awake()
    {
        _text = transform.FindChild("Label").GetComponent<UILabel>();
        btnClick = gameObject.GetComponent<UIButton>();
    }

    private void Start()
    {
        UIEventListener.Get(btnClick.gameObject).onClick += OnClickBtn;
    }

    private void OnClickBtn(GameObject go)
    {
        if (OnClickCallBack != null)
        {
            OnClickCallBack(DateTime);
        }
    }

    public void SetDay(DateTime dateTime, Color fontColor)
    {
        DateTime = dateTime;
        _text.text = dateTime.Day.ToString();
        _text.color = fontColor;
    }
    public void SetMonth(DateTime dateTime)
    {
        DateTime = dateTime;
        _text.text = GetMonth(dateTime.Month.ToString());
    }
    public void SetYear(DateTime dateTime)
    {
        DateTime = dateTime;
        _text.text = dateTime.Year.ToString();
    }
    private string GetMonth(string month)
    {
        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 "";
        }
    }
}

public class CalendarData
{
    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;
    }
    public List<DateTime> Months(DateTime year)
    {
        List<DateTime> months = new List<DateTime>();
        DateTime firstMonth = new DateTime(year.Year, 1, 1);
        months.Add(firstMonth);
        for (int i = 1; i < 12; i++)
            months.Add(firstMonth.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;
    }
}

Package链接:https://download.csdn.net/download/sinat_36373961/11106775

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值