1
ноя
  Хозяйке на заметку 4 балла
 

Сегодня мы разберём пару интересных и/или полезных особенностей FlashPlayer, о некоторых из которых я долгое время даже и не подозревал.

Установка флешки на паузу, при запуске в debug версии FlashPlayer


Оказывается (!!!) есть возможность установки флешки на паузу, если флешка запускается в debug версии FlashPlayer. Для того, чтобы это сделать, достаточно вызвать метод System.pause(), после чего флешка остановится и не будет реагировать ни на какие действия пользователя. В ней не будет выполняться ни какой код, кроме кода, который слушает события Socket соединений (если я правильно понял официальное описание этого метода). Чтобы возобновить работу флешки, после установки её на паузу, необходимо вызвать метод System.pause().

А вот и код, на примере которого можно увидеть, как работает установка флешки на паузу, напомню, что для просмотра нужна именно debug версия FlashPlayer, в обычной версии, при клике на кнопку ничего не будет происходить:

package  
{
	import flash.display.SimpleButton;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.system.System;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	import flash.utils.Timer;
	/**
	 * ...
	 * @author Mark (ruFlashist@gmail.com)
	 */
	public class SystemPause extends Sprite
	{
		// Интервал таймера, который будет изменять цвет фона
		static private const CHANGE_COLOR_TIMER_INTERVAL:Number = 500;
		
		// Начальные координаты для кнопки установки флешки на паузу
		static private const PAUSE_BTN_START_X:Number = 50;
		static private const PAUSE_BTN_START_Y:Number = 50;
		// Текст кнопки установки флешки на паузу
		static private const PAUSE_BTN_TEXT:String = "Кликни, чтобы установить флешку на паузу";
		
		// Таймер, который будет изменять цвет фона
		private var changeColorTimer:Timer;
		
		// Кнопка, которая будет ставить всю флешку на паузу
		private var pauseBtn:Sprite;
		
		public function SystemPause()
		{
			// Если объект уже в списке отображения
			if (this.stage) 
			{	
				this.onAddedToStage();
			
			// Если объект ещё не в списке отображения
			}else
			{
				this.addEventListener(Event.ADDED_TO_STAGE, this.onAddedToStage);
			}
		}
		
		/**
		 * Слушатель события добавления объекта к списку отображения.
		 * 
		 * @param	event объект события.
		 */
		private function onAddedToStage(event:Event = null):void 
		{
			this.removeEventListener(Event.ADDED_TO_STAGE, this.onAddedToStage);
			
			this.construction();
		}
		
		
		/**
		 * Функции создания и уничтожения объекта.
		 */
		
		/**
		 * Создание объекта.
		 */
		protected function construction():void
		{
			// Стандартные настройки Stage
			this.stage.align = StageAlign.TOP_LEFT;
			this.stage.scaleMode = StageScaleMode.NO_SCALE;
			this.stage.showDefaultContextMenu = false;
			this.tabEnabled = false;
			this.tabChildren = false;
			
			// Создаём таймер, который будет изменять цвет фона
			this.createChangeColorTimer();
			this.startChangeColorTimer();
			this.setRandomFonColor();
			
			// Создаём кнопку, которая будет устанавливать флешку на паузу
			this.createPauseBtn();
			
			this.addListeners();
		}
		
		
		/**
		 * Функции для добавления и удаления слушателей.
		 */
		
		/**
		 * Добавление всех необходимых слушателей.
		 */
		protected function addListeners():void
		{
			this.pauseBtn.addEventListener(MouseEvent.CLICK, this.onPauseBtnClick);
		}
		
		/**
		 * Удаление всех необходимых слушателей.
		 */
		protected function removeListeners():void
		{
			this.pauseBtn.removeEventListener(MouseEvent.CLICK, this.onPauseBtnClick);
		}
		
		/**
		 * Слушатель события клика на кнопке установки флешки на паузу.
		 * 
		 * @param	event событие мышки.
		 */
		private function onPauseBtnClick(event:MouseEvent):void
		{
			// Устанавливаем флешку на паузу
			System.pause();
		}
		
		
		/**
		 * Функции для работы с таймером changeColorTimer.
		 */
		
		/**
		 * Создание таймера changeColorTimer.
		 */
		private function createChangeColorTimer():void
		{
			this.changeColorTimer = new Timer(SystemPause.CHANGE_COLOR_TIMER_INTERVAL);
			this.changeColorTimer.addEventListener(TimerEvent.TIMER, this.onChangeColorTimer);
		}
		
		/**
		 * Слушатель события TimerEvent.TIMER для таймера changeColorTimer.
		 *
		 * @param	event событие таймера.
		 */
		private function onChangeColorTimer(event:TimerEvent):void
		{
			trace("SystemPause | onChangeColorTimer");
			
			this.setRandomFonColor();
		}
		
		/**
		 * Запуск таймреа changeColorTimer.
		 */
		private function startChangeColorTimer():void
		{
			this.changeColorTimer.start();
		}
		
		/**
		 * Остановка таймера changeColorTimer.
		 */
		private function stopChangeColorTimer():void
		{
			this.changeColorTimer.stop();
		}
		
		
		/**
		 * Функция для изменения цвета фона флешки.
		 */
		private function setRandomFonColor():void
		{
			var newColor:uint = Math.round(Math.random() * 0xFFFFFF);
			this.graphics.clear();
			this.graphics.beginFill(newColor);
			this.graphics.drawRect(0, 0, this.stage.stageWidth, this.stage.stageHeight);
			this.graphics.endFill();
			
			trace("newColor = " + newColor);
		}
		
		
		/**
		 * Создание кнопки, которая будет устанавливать флешку на паузу.
		 */
		private function createPauseBtn():void
		{
			this.pauseBtn = new Sprite();
			this.addChild(this.pauseBtn);
			this.pauseBtn.x = SystemPause.PAUSE_BTN_START_X;
			this.pauseBtn.y = SystemPause.PAUSE_BTN_START_Y;
			this.pauseBtn.useHandCursor = true;
			this.pauseBtn.buttonMode = true;
			this.pauseBtn.mouseChildren = false;
			
			// Создаём текстовое поле для кнопки
			var _tf:TextField = new TextField();
			_tf.border = true;
			_tf.background = true;
			_tf.selectable = false;
			_tf.multiline = false;
			_tf.wordWrap = false;
			_tf.autoSize = TextFieldAutoSize.LEFT;
			// Увеличиваем размер текста
			var format:TextFormat = _tf.defaultTextFormat;
			format.size = 20;
			_tf.defaultTextFormat = format;
			// Устанавливаем текст кнопки
			_tf.text = SystemPause.PAUSE_BTN_TEXT;
			
			this.pauseBtn.addChild(_tf);
		}
	}

}

Если компилировать данный код лень, то всегда можно скачать архив с уже готовым проектом или посмотреть на саму флешку.

На самом деле, для меня, пока, остаётся загадкой, когда данный метод нужно применять в реальной разработке (не студенческой, не для себя, а именно в реальных условиях), так как мы ведь не можем заставить всех пользователей установить себе дебаг версию плеера. Но пусть это остаётся на корпорации Adobe и разработчиках FlashPlayer, им виднее.

Инициализация сборщика мусора в debug версии FlashPlayer


Продолжая тему особенностей debug версии FlashPlayer, заглянем на страничку метода System.gc(), который инициализирует запуск сборщика мусора.

Наверно, иногда при отладке приложений данный метод действительно может быть полезен. Или когда мы делаем приложение «для себя» и знаем, что оно будет запускаться исключительно в debug версии плеера.

Завершение циклов через ссылки


Переходим к штукам, применение которых не требует наличия какой-то особенной версии FlashPlayer. Буквально около недели назад, узнал о том, что циклам можно присваивать ссылки и работать с этими ссылками для завершения циклов (например конструкция break). Всем, кто не знает (вдруг такие есть =), конструкция break умеет прерывать циклы до их нормального завершения. Предположим ситуацию, что у нас есть несколько вложенных циклов, и при выполнении каких-то условий нам нужно завершить не внутренний цикл, а внешний, главный цикл. Как это сделать?! Кто-нибудь знает? А я, с недавнего времени, знаю =) И делюсь с вами кодом, который делает это:

package  
{
	import flash.display.Sprite;
	/**
	 * ...
	 * @author Mark (ruFlashist@gmail.com)
	 */
	public class ArrayLinakges extends Sprite
	{		
		
		public function ArrayLinakges()
		{
			var index:int;
			var totalIndex:int = 0;
			var maxIndex:int = 500;
			// Цифра, при достижении которой должны завершаться все циклы
			var stopIndex:int = 5000;
			
			// Данный цикл никогда не будет завершён, так как true даёт true =)
			linkage: while (true)
			{
				for (index = 0; index < maxIndex; index++)
				{
					totalIndex++
					trace("totalIndex = " + totalIndex);
					if (totalIndex == stopIndex)
					{
						trace("Останавливаем главный цикл while");
						break linkage;
						// Если раскомментировать следующую строчку и закомментировать предыдущую,
						// то завершение циклов никогда не произойдёт
						// break
					}
				}
			}
		}
	}

}

Готовую флешку по этому коду я вам не покажу, но архивчик с исходниками покажу, покажу =)

Убирание жёлтой рамки для всех DisplayObject объектов флешки


И ещё одна, довольно-таки полезная в повседневной разработке штука. Думаю, что многие из вас знают, что при нажатии на кнопку табуляции (Tab), происходит появление жёлтой рамки, которая перескакивает на все находящиеся сейчас на сцене объекты InteractiveObject (клипы, текстовые поля, кнопки и т.п.). Если эта жёлтая рамка вам надоела, и вы хотели бы раз и на всегда избавиться от неё, то в корневом классе приложения достаточно всего-лишь написать:

this.tabEnabled = false;
this.tabChildren = false;

Данное простое и, в принципе, понятное решение родилось из вопроса на всеми-нами-любимом-форуме Flasher.ru.

Всем всего хорошего и клёвого, и суперского, и по-больше знаний и профессионализма. Ну вот как-то так =) Йоу

Комментарии (2)   Автор: admin
Комментарии
FlashER
03.11.10 | 14:18
17 баллов

Спс Админу! Мне сейчас как раз пригодилась подсказка про жёлтую рамку))

andvolodko
26.07.11 | 12:55
0 баллов

Убрать жёлтую рамку мне помог этот код
stage.stageFocusRect = false;

 
 
 
 

Последние комментарии

Полезные ссылки

Реклама сайтов