Журат М. - AFramework
-
Upload
innim -
Category
Engineering
-
view
111 -
download
0
Transcript of Журат М. - AFramework
![Page 1: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/1.jpg)
Автор: Журат М.И.(для внутреннего использования в ООО «Инним»)
AFramework
![Page 2: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/2.jpg)
AFramework – это MVC(S) фреймворк с привкусом Flex фреймворка
Начало формирования: ~2009/2010 год
Текущая версия: 0.8
![Page 3: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/3.jpg)
Визуальные компоненты;Сервисы (HTTP, Sockets);Загрузчики файлов;Модели;Таски (Tasks);Твины/эффекты;Менеджеры; Утилитные классы и компоненты.
Основные пакеты фреймворка:
![Page 4: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/4.jpg)
«Черный ящик»
Черный ящик
Вход Выход
![Page 5: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/5.jpg)
Новый код просто кишит ошибками;Высокие трудо- (и время) – затраты;Большое количество часто
используемых классов и компонентов;Использование общепринятых
паттернов программирования;Гибкая и простая архитектура;Повышение понимания чужого кода за
счет использования фреймворка.
Почему нужно использовать фреймворк ?
![Page 6: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/6.jpg)
Сложный пользовательский интерфейс;Производительный код;Скорость разработки интерфейса;Широкий выбор базовых компонентов;Легкая расширяемость и
компануемость визуальных компонентов;
Поддержка скинирования, лейаутов и инвалидации.
Визуальная составляющая фреймворка
![Page 7: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/7.jpg)
UIComponent – базовый класс всех
визуальных компонентов
![Page 8: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/8.jpg)
Отложенная валидация на примере отложенной отрисовкиpublic function set backgroundAlpha(value:Number):void{ _backgroundAlpha = value; redraw();}public function set backgroundColor(value:uint):void{ _backgroundColor = value; redraw();}private function redraw():void{ var g:Graphics = this.graphics; g.clear(); g.beginFill(_backgroundColor, _backgroundAlpha); g.drawRect(0, 0, width, height);}
![Page 9: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/9.jpg)
Отложенная валидация на примере отложенной отрисовки
var rect:Rect = new Rect();rect.backgroundColor = 0xFF0000;rect.backgroundAlpha = 0.7;rect.cornerRadius = 15;rect.width = 150;rect.height = 400;addChild(rect);
![Page 10: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/10.jpg)
Отложенная валидация на примере отложенной отрисовкиpublic function set backgroundColor(value:uint):void{ _backgroundColor = value; _graphicsInvalid = true;}
public function redraw():void{ if (_graphicsInvalid) { var g:Graphics = this.graphics; g.clear(); g.beginFill(_backgroundColor, _backgroundAlpha); g.drawRect(0, 0, width, height); }}
![Page 11: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/11.jpg)
Отложенная валидация на примере отложенной отрисовки
public function set backgroundColor(value:Number):void{ _backgroundColor = value; invalidateDisplayList();}
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{ var g:Graphics = this.graphics; g.clear(); g.beginFill(_backgroundColor, _backgroundAlpha); g.drawRect(0, 0, width, height);}
![Page 12: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/12.jpg)
#createChildren();#commitProperties() - #invalidateProperties();
#measure() - #invalidateSize();
#updateDisplayList() - #invalidateDisplayList().
UIComponent
![Page 13: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/13.jpg)
#commitProperties() -
#invalidateProperties();
UIComponent
![Page 14: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/14.jpg)
Пример валидации свойствoverride protected function commitProperties():void { if (_sourceInvalid) { if (_untrustedContent) { removeChild(_untrustedContent); _contentLoader .poolContent(_untrustedContent); _untrustedContent = null; } if (_sourceUrl && _sourceUrl.length > 0) _contentLoader.load(_sourceUrl, onContentLoadComplete); invalidateSize(); invalidateDisplayList(); _sourceInvalid = false; }}
![Page 15: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/15.jpg)
#measure() - #invalidateSize();
UIComponent
![Page 16: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/16.jpg)
UIComponent
#width/height#minWidth/#minHeight#maxWidth/#maxHeight#explicitWidth/#explicitHeight#measuredWidth/#measuredHeight
#setActualSize#contentWidth/#contentHeight
![Page 17: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/17.jpg)
Пример расчета размеров компонента
override protected function measure():void{ if (iconDisplay) { var iconWidth:int = iconDisplay.width; var iconHeight:int = iconDisplay.height; }
if (labelDisplay) { var labelWidth:int = labelDisplay.width; var labelHeight:int = labelDisplay.height; }
_measuredWidth = Math.max(_background.width, iconWidth + labelWidth); _measuredHeight = Math.max(_background.height, iconHeight, labelDisplay.height);}
![Page 18: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/18.jpg)
#updateDisplayList() - #invalidateDisplayList();
UIComponent
![Page 19: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/19.jpg)
Пример отрисовки компонента
override protected function updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number):void{ var g:Graphics = this.graphics; g.clear(); DrawUtil.drawCornerButton(g, background, 0, 0, unscaledWidth);
// иконка var ty:Number = (unscaledHeight - icon.height) * .5; DrawUtil.drawSprite(g, list, CommonWindowAsset.COIN_ICON, HPADDING - 1, ty);
// распологаем надпись _label.y = (unscaledHeight - _label.height) * .5 - .5; _label.x = HPADDING + icon.width + HGAP;}
![Page 20: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/20.jpg)
#currentState - #onCurrentStateChanged
();
UIComponent
![Page 21: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/21.jpg)
Возможные состояния обычной кнопки
Up state
Over state
Down state
Disabled state
![Page 22: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/22.jpg)
Поддержка лейаутовОбрезка содержимого
Group
![Page 23: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/23.jpg)
Автоизмерение размеров контейнера
Расположение дочерних элементов
Виртуализация
Лейауты (Layouts)
![Page 24: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/24.jpg)
Пример лейаута
![Page 25: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/25.jpg)
Пример 3D лейаута
![Page 26: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/26.jpg)
Пример простого лейаута
public class AHorizontalLayout extends ALayoutBase{ override protected function measure ():void { for (var i:int = 0;i< target.numChildren;++i) { var child:DisplayObject = target.getChildAt(i); measuredWidth+= child.width; measuredHeight = Math.max( measuredHeight, child.height); } }}
![Page 27: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/27.jpg)
Пример простого лейаута
override protected function updateDisplayList(w:Number, h:Number):void{ var tx:Number = 0;
for (var i:int = 0;i<target.numChildren;++i) { var child:DisplayObject = target.getChildAt(i);
child.y = 0; child.x = tx; tx+= child.width; }}
![Page 28: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/28.jpg)
#clipAndEnableScrolling;#horizontalScrollPosition;#verticalScrollPosition;#contentWidth;#contentHeight.
Group#viewPort
![Page 29: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/29.jpg)
Group#viewPort
horizontalScrollPosition,verticalScrollPosition
0,0
contentWidth
contentHeight
widthheight
0,0
width
height
![Page 30: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/30.jpg)
Group#viewPort
![Page 31: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/31.jpg)
IDataRenderer (DataRenderer / ItemRenderer);
IList (ArrayList / ArrayCollection / PagableArrayCollection);
Бесконечный список (Infinite list).
DataGroup
![Page 32: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/32.jpg)
DataGroup
![Page 33: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/33.jpg)
DataGroup
![Page 34: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/34.jpg)
DataGroup
![Page 35: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/35.jpg)
Виртуализация
ViewPort (видимая область)
Виртуальные элементы
Виртуальные элементы
![Page 36: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/36.jpg)
Виртуализация
![Page 37: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/37.jpg)
Высокий уровень стилизации;В качестве скина можно использовать
любой визуальный компонент;Низкая связанность;Возможность использовать скины
отдельно;Сокрытие сложности;Возможность изменять функциональность
компонента;Широкие возможности по отделению
бизнес-логики от визуальной мишуры.
SkinnableComponent
![Page 38: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/38.jpg)
UserView
public class UserView extends ASkinnableComponent{ public var nameDisplay:IDisplayText; public var levelDisplay:IDisplayText; public var scoreDisplay:IDisplayText; public var avatarDisplay:AvatarBitmapImage;
//объявление остальных частей скина
![Page 39: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/39.jpg)
UserView
override protected function registerSkinParts():void{ _skinParts = { nameDisplay : false, levelDisplay : false, scoreDisplay : false, avatarDisplay: false }}
![Page 40: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/40.jpg)
UserView
override protected function partAdded(partName:String, instance:Object):void
{ super.partAdded(partName, instance);
if (instance === avatarDisplay) avatarDisplay.sourceUrl = _source.avatarUrl; else if (instance === nameDisplay) nameDisplay.text = _source.name; // else }
![Page 41: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/41.jpg)
UserViewoverride protected function getCurrentSkinState():String{ if (!_source) return UserViewSkinStates.STATE_EMPTY; return _source.me ? UserViewSkinStates.STATE_CURRENT_USER : UserViewSkinStates.STATE_USER;}
![Page 42: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/42.jpg)
UserViewoverride protected function commitProperties():void{ if (_sourceInvalid) { _source.addEventListener( AModelEvent.MODEL_CHANGED,
onSourceChanged);
if (nameDisplay) nameDisplay.text = _source.name;
if (levelDisplay) levelDisplay.text = _source.level;
if (avatarDisplay) avatarDisplay.sourceUrl = _source.avatarUrl;
if (scoreDisplay) scoreDisplay.text = _source.score;
}}
![Page 43: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/43.jpg)
UserView
![Page 44: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/44.jpg)
TitleWindow
![Page 45: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/45.jpg)
Панель друзей
![Page 46: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/46.jpg)
Окно выбора друга
![Page 47: Журат М. - AFramework](https://reader036.fdocuments.net/reader036/viewer/2022070514/587e9e541a28ab2a4a8b4fd9/html5/thumbnails/47.jpg)
Спасибо за внимание!