View
1.199
Download
0
Category
Preview:
DESCRIPTION
Докладчик - Виталий Хить
Citation preview
АРХИТЕКТУРА МИНИМАЛЬНЫХ UI КОМПОНЕНТ
Виталий Хить (well)
ЗАЧЕМ ЭТО НУЖНО?
Виджеты Примеры кода Собственное обучение
ГОТОВЫЕ КОМПОНЕНТЫ
Flex Flash Minimal Components (bit-101.com)
FLEX
Плюсы Минусы
Большое количество на все случаи жизни
Тяжелая swf
Хорошая документация Тормоза
Постоянные обновления mxml
Индустриальный стандарт Большое количество вспомогательных классов
FLASH
Плюсы Минусы
Облегченная swf Коммерческая версия
Хорошая документация Безобразный код
Минимальное количество классов Заточены под Flash
Удобство скинирования Базируются на MovieClip
MINIMAL COMPONENTS
MINIMAL COMPONENTS
Плюсы Минусы
Очень маленький объем swf Версия не дошла до 1
Встроенный шрифт Спорное проектирование базовых классов
Неплохой дизайн Отсутствие скинов
Минимальное количество классов Минимальная документация
СТРУКТУРА КОМПОНЕНТА
Компонент Мышка
Отображение
Клавиатура
МенеджерМенеджер
МЕНЕДЖЕР КЛАВИАТУРЫ
Менеджер
«ТAB»
Экземпляр компонента
Экземпляр компонента
Ввод с клавиатуры
Активный компонент
МЕНЕДЖЕР ОТОБРАЖЕНИЯ (СТИЛИ)
Менеджер
Параметры класса
Класс
Экземпляр
Экземпляр
Класс
Глобальные параметры
СТРУКТУРА КЛАССА КОМПОНЕНТА
Компонент
Менеджер отображения
Скин экземпляра
Менеджер отображения
Менеджер мышки
Менеджер свойств
UICOMPONENT EXTENDS SPRITE / MOVIECLIP
Sprite MovieClip
«Один кадр» «Много кадров»
Легкий Тяжелый
Flex Flash
UICOMPONENT СВОЙСТВА
Координаты Размеры Состояния
Visible Enabled Мышка (up, over, down) Значения
Стили Стили экземпляра компонента Глобальные стили (класс, глобальные)
UICOMPONENT CТРУКТУРА МЕНЕДЖЕРА СВОЙСТВ
Изменение большого количества свойств между интервалами ENTER_FRAME
Установление флага об изменении свойств и установка листенера на ENTER_FRAME
Изменение видимого отображения компонента на следующем ENTER_FRAME
МЕНЕДЖЕР СВОЙСТВstatic public const ISIZE :uint = 0x01;static public const ISTYLE :uint = 0x02;……. protected var invalidHash :uint;……. public function invalidate(property: uint = InvalidationType.ALL, callLater :Boolean = true):void { invalidHash |= property; if (!_inCallLater) { addEventListener(Event.ENTER_FRAME, callLaterDispatcher,false,0,true); _inCallLater = true; }}
protected function validate():void { invalidHash = 0; _inCallLater = false;}
private function callLaterDispatcher(event:Event):void { removeEventListener(Event.ENTER_FRAME,callLaterDispatcher); draw(); }
protected function draw() :void { if (isValid(ISTYLE | ISIZE)) { ... } validate();}
UICOMPONENT ОГРАНИЧИВАЮЩИЙ ПРЯМОУГОЛЬНИК
x, y -> _x, _y, move() width, height -> _width, _height,
setSize() scaleX, scaleY
UICOMPONENT СТИЛИ КЛАССА
static private const defaultStyles:Object = { color :0xffffff, defaultLabel : “Label”, disabledSkin : “Label_DisabledSkin”};public static function getStyleDefinition():Object {
return defaultStyles;
}
UICOMPONENT МЕНЕДЖЕР СТИЛЕЙprotected var instanceStyles:Object;
protected function getStyleValue(name:String):Object { return (instanceStyles[name] == null) ? StyleManager.getStyleValue(name, _classDef) : instanceStyles[name];}
protected function getDisplayObjectInstance(skin:Object):DisplayObject { var classDef:Object = null; if (skin is Class) { return (new skin()) as DisplayObject; } else if (skin is DisplayObject) { (skin as DisplayObject).x = 0; (skin as DisplayObject).y = 0; return skin as DisplayObject; } try { classDef = getDefinitionByName(skin.toString()); } catch(e:Error) { try { classDef = loaderInfo.applicationDomain.getDefinition(skin.toString()) as Object; } catch (e:Error) { // Nothing } } if (classDef == null) { return null; } return (new classDef()) as DisplayObject;}
МЕНЕДЖЕР СТИЛЕЙ
private static var _instances :Dictionary = new Dictionary(true);
private static var _styles :Dictionary = new Dictionary(true);
public static function getStyleValue(name :String, classDef :Class = null) :Object{ var style :Object = _styles[classDef]; return (style && style[name]) ? style[name] : _styles[null][name]; }
public static function setStyle(name :String, value :Object, classDef :Class = null) :void{ if (!_styles[classDef]) _styles[classDef] = {}; _styles[classDef][name] = value; if (classDef) invalidateStyle(classDef); else for (var obj :* in _instances) invalidateStyle(obj == 'null' ? null : obj); }
МЕНЕДЖЕР СТИЛЕЙ
public static function registerInstance(instance :UIComponent) :void { var classDef :Class = getClassDef(instance); if (!classDef) return; if (!_instances[classDef]) _instances[classDef] = new Dictionary(true); _instances[classDef][instance] = true; if (_styles[classDef]) return; var target :Class = classDef; var defaultStyles :Object = null; while (!defaultStyles) { if (target["getStyleDefinition"]) { defaultStyles = target["getStyleDefinition"](); break; } try { target =
instance.loaderInfo.applicationDomain.getDefinition(getQualifiedSuperclassName(target)) as Class; } catch(err :Error) { try { target = getDefinitionByName(getQualifiedSuperclassName(target)) as Class; } catch (e:Error) { defaultStyles = UIComponent.getStyleDefinition(); break; } } } _styles[classDef] = defaultStyles; if (!_styles[null]) _styles[null] = UIComponent.getStyleDefinition(); }
СКИНЫ
Flash Flex
Библиотечные символы Embeded классы
Имя класса указывается при экспорте
Имя класса генерируется компилятором
По умолчанию скин MovieClip По умолчанию скин SpriteAsset
Swf «чистая» Добавляются вспомогательные классы из Flex SDK
[EMBED…
public class fl.controls.Button extends UIComponent {[Embed (source='../skin/skin.swf', symbol='Button_disabledSkin')]static private var disabledSkin :Class;
public class fl.controls.Button_disabledSkin extends SpriteAsset
private static var defaultStyles:Object = {disabledSkin :"fl.controls::Button_disabledSkin",
ЧИСТКА FLASH КОМПОНЕНТОВ
Удалить acsessibility составляющую Удалить FocusManager и сопутствующие классы Упростить Style Manager Удалить из UIComponent
Связь с фокус менеджером Связь со средой разработки Flash (?) Изменение scale составляющей
Исправить ошибки в дочерних классах Изменить названия скинов (если используется
flex)
Recommended