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