Тема: Календарь
Показать сообщение отдельно
Старый 13.09.2011, 18:34
dr1emaver вне форума Посмотреть профиль Отправить личное сообщение для dr1emaver Найти все сообщения от dr1emaver
  № 7  
Ответить с цитированием
dr1emaver

Регистрация: Aug 2011
Сообщений: 24
Код брал с сайта demiart и вот код класса :
Код AS3:
package {
 
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.text.TextFormatAlign;
	import com.greensock.*;
	import com.greensock.easing.*;
 
	public class Calendar extends MovieClip {
 
		public static const CHANGEDATE:String = 'changedate';//константа для имени события
		public static const XGRID:Number = 12;//координаты сетки из ячеек с датами и панельки с днями недели
		public static const YGRID:Number = 95;
		public static const YDAYS:Number = 60;
		public static const BETWEENCELLS:Number = 5;//расстояние между ячейками
 
		private var _dateObject:Date;//экземпляр нужен для получения значений текущей даты, дня недели, года
 
		private var _currentDate:Number;//текущая дата
		private var _currentDay:Number;//текущий день недели
		private var _currentMonth:Number;//текущий месяц
		private var _currentYear:Number;//текущий год
		private var _days:Array;//массив для хранения названий дней недели
		private var _dates:Array;//массив для хранения дат
		private var _months:Array;//массив для хранения названий месяцев
		private var _daysinMonth:Array;//массив для хранения количества дней в месяце
 
		private var _nextMonthButton:NextMonthButton;//кнопки
		private var _prevMonthButton:PrevMonthButton;
		private var _nextYearButton:NextYearButton;
		private var _prevYearButton:PrevYearButton;
		private var _textCurrentMonth:TextField;//текстовое поле для названия месяца
		private var _textCurrentYear:TextField;//текстовое поле для значения года
		private var _formateTextMonthAndYear:TextFormat;//форматы для текстовых полей
		private var _formateTextDate:TextFormat;
		private var _formateTextDays:TextFormat;
 
		private var _startCell:Number;//ячейка с сегодняшней датой
 
		public function Calendar() {
			init();
		}
 
		private function init():void {
 
			_dateObject = new Date();
			_currentDate = _dateObject.getDate();
			_currentDay = _dateObject.getDay();
			_currentYear = _dateObject.getFullYear();
			_currentMonth =	_dateObject.getMonth();
			_days = ['пн', 'вт', 'ср', 'чт', 'пт', 'сб', 'вс']
			_months = ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"];
			_daysinMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
 
			buildHeader();//создаем текстовые поля для названия месяца, года; создаем панельку с днями недели
			buildGrid();//создаем сетку из ячеек с датами
			showCurrentDate();//изменяем сетку в соответствии с видом текущего месяца
 
			//когда пользователь кликает по кнопкам	для изменения даты или года (см метод onClick()),
			//мы отправляем событие Calendar.CHANGEDATE, которое обрабатывает метод onChangeDate()
			addEventListener(MouseEvent.CLICK, onClick);
			addEventListener(Calendar.CHANGEDATE, onChangeDate);
			addEventListener(MouseEvent.CLICK,onDate); // по нажатию на иконку дату перемещаем.
					}
 
		private function buildHeader():void {
 
			//создаем экземпляр текстового поля с присоединенным шрифтом, чтобы
			//этот шрифт можно было использовать в нашем ролике
			var textEmbed:TextEmbed = new TextEmbed();
 
			//создаем формат текстовых полей для названия месяца и значения года
			_formateTextMonthAndYear = new TextFormat();
			_formateTextMonthAndYear.color = 0x333333;
			_formateTextMonthAndYear.font = 'Tahoma';
			_formateTextMonthAndYear.size = '16';
			_formateTextMonthAndYear.bold = true;
			_formateTextMonthAndYear.align = TextFormatAlign.CENTER;
 
			//создаем формат текстового поля для значений даты
			_formateTextDate = new TextFormat();
			_formateTextDate.color = 0xffffff;
			_formateTextDate.font = 'Tahoma';
			_formateTextDate.size = '13';
			_formateTextDate.bold = true;
			_formateTextDate.align = TextFormatAlign.CENTER;
 
			//создаем формат текстового поля для значений дней недели
			_formateTextDays = new TextFormat();
			_formateTextDays.color = 0xffffff;
			_formateTextDays.font = 'Tahoma';
			_formateTextDays.size = '14';
			_formateTextDays.bold = true;
			_formateTextDays.align = TextFormatAlign.CENTER;
 
			//создаем текстовое поле для названия месяца
			_textCurrentMonth = new TextField();
			_textCurrentMonth.selectable = false;
			_textCurrentMonth.defaultTextFormat = _formateTextMonthAndYear;
			_textCurrentMonth.embedFonts = true;
			_textCurrentMonth.x = 23;
			_textCurrentMonth.y = 25;
			_textCurrentMonth.width = 90;
			_textCurrentMonth.height = 40;
			_textCurrentMonth.text = _months[_currentMonth];
			addChild(_textCurrentMonth);
 
			//создаем текстовое поле для значения года
			_textCurrentYear = new TextField();
			_textCurrentYear.embedFonts = true;
			_textCurrentYear.selectable = false;
			_textCurrentYear.defaultTextFormat = _formateTextMonthAndYear;
			_textCurrentYear.x = 137;
			_textCurrentYear.y = 25;
			_textCurrentYear.width = 80;
			_textCurrentYear.height = 40;
			_textCurrentYear.text = _currentYear.toString();
			addChild(_textCurrentYear);
 
			//создаем ячейки с названиями дней недели
			for (var i:int = 0; i < _days.length; i++) {
				var bgDay:BgDay = new BgDay();
				addChild(bgDay);
				bgDay.x = i * (bgDay.width + BETWEENCELLS) + XGRID;
				bgDay.y = YDAYS;
 
				var textDay:TextField = new TextField();
				textDay.mouseEnabled = false;
				textDay.selectable = false;
				textDay.text = _days[i];
				textDay.width = 30;
				textDay.height = 30;
				textDay.embedFonts = true;
				textDay.setTextFormat(_formateTextDays);
				bgDay.addChild(textDay);
				textDay.x = -3;//эти значения получаем опытным путем :)
				textDay.y = 1;
 
			}
 
 
			//создаем кнопки для изменения месяцев и лет
			_nextMonthButton = new NextMonthButton();
			_nextMonthButton.stop();
			_nextMonthButton.x = 115;
			_nextMonthButton.y = 33;
			_nextMonthButton.buttonMode = true;
			_nextMonthButton.useHandCursor = true;
			addChild(_nextMonthButton);
 
			_prevMonthButton = new PrevMonthButton();
			_prevMonthButton.stop();
			_prevMonthButton.x = 15;
			_prevMonthButton.y = 33;
			_prevMonthButton.buttonMode = true;
			_prevMonthButton.useHandCursor = true;
			addChild(_prevMonthButton);
 
			_nextYearButton = new NextYearButton();
			_nextYearButton.stop();
			_nextYearButton.x = 209;
			_nextYearButton.y = 33;
			_nextYearButton.buttonMode = true;
			_nextYearButton.useHandCursor = true;
			addChild(_nextYearButton);
 
			_prevYearButton = new PrevYearButton();
			_prevYearButton.stop();
			_prevYearButton.x = 137;
			_prevYearButton.y = 33;
			_prevYearButton.buttonMode = true;
			_prevYearButton.useHandCursor = true;
			addChild(_prevYearButton);
		}
 
		private function onChangeDate(e:Event):void {
			clearGrid()//убираем старую сетку
			buildGrid();//делаем новую
			showCurrentDate();
		}
 
		private function clearGrid():void {
 
			//удаляем все ячейки
			_dates = null;
			while (getChildAt(numChildren-1) is BgDate) {
				removeChild(getChildAt(numChildren-1));
			};
 
			//создаем новый объект Date, со значениями года и месяца, которые выбрал пользователь
			_dateObject = new Date(_currentYear,_currentMonth, _currentDate); 
			_currentDate = _dateObject.getDate();
			_currentDay = _dateObject.getDay();
			_currentYear = _dateObject.getFullYear();
			_currentMonth =	_dateObject.getMonth();
		}
 
		private function showCurrentDate():void {
 
			//небольшая проверка на високосный год, если год не високосный, то в феврале 28 дней
			_daysinMonth[1] = 28;
 
			//если високосный - 29
			if ((_currentYear / 4 - Math.floor(_currentYear / 4) == 0)) {
				_daysinMonth[1] = 29;
			}
 
			if (_currentYear / 100 - Math.floor(_currentYear / 100) == 0 &&
			_currentYear / 400 - Math.floor(_currentYear / 400) != 0) {
				_daysinMonth[1] = 28;
			}
 
			//ищем в сетке ближайшую ячейку, день недели которой совпадает со значением _currentDay
			for (var i:Number = _currentDate - 1; i < _dates.length - 1; i++) {
				if (_dates[i][1] == _currentDay) {
					_startCell = i;
					_dates[i][2].gotoAndStop(2);
					break;
				}
			}
 
			var tempNumber:Number;
			tempNumber = _startCell;
 
			//функция добавляет текстовое поле в ячейку
			function attachTextField(it:Number):void {
				var textDate:TextField = new TextField();
				textDate.mouseEnabled = false;
				textDate.selectable = false;
				textDate.text = it.toString();
				textDate.width = 30;
				textDate.height = 30;
				textDate.embedFonts = true;
				textDate.setTextFormat(_formateTextDate);
				_dates[tempNumber][2].addChild(textDate);
				textDate.x = -3;//эти значения получаем опытным путем :)
				textDate.y = 1;
			}
 
			//добавляем текстовые поля к ячейкам от текущей даты до первого числа месяца
			for (var j:Number = _currentDate; j > 0; j--) {
				attachTextField(j);
				tempNumber--;
			}
 
			//восстанавливаем значение tempNumber
			tempNumber = _startCell;
 
			//добавляем текстовые поля к ячейкам от текущей даты до последнего числа месяца
			for (var k:Number = _currentDate; k <= _daysinMonth[_currentMonth]; k++) {
				attachTextField(k);
				tempNumber++;
			}
 
			//удаляем ячейки без текстовых полей из списка отображения, хотя можно этого и не делать,
			//а просто изменять их внешний вид
			for (var l:Number = 0; l < _dates.length ; l++) {
				if (_dates[l][2].numChildren==1) {
					removeChild(_dates[l][2]);
				}
			}
]
Дальше продолжение этого же класса