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