Spark Alert
Запись от alatar размещена 02.12.2010 в 20:22
Обновил(-а) alatar 13.12.2010 в 12:11 (Перенесено в Flex 4)
Обновил(-а) alatar 13.12.2010 в 12:11 (Перенесено в Flex 4)
Надеюсь многие уже успели оценить spark компоненты, которые появились в FlexSDK 4. Не для кого не секрет, что Adobe реализовала в spark далеко не все компоненты которые доступны в пакете mx.
И так, постараемся восполнить, этот досадный пробел. В частности, хочу представить вам реализацию Alert на основе SkinnableComponent.
Итак, чего же хотелось бы получить?
1. Полную совеместимость с Alert в коде. Т.е. по-сути должно быть достаточно заменить в коде:
на импорт нашего компонента и все должно работать.
2. Полный контроль над видом нашего Alert. Тут спасибо Adobe, все делается на ура.
Подробно останавливаться на коде я не буду. Желающие могут посмотреть в исходниках. Остановлюсь лишь на ключевых моментах.
Почему был выбран именно SkinnableComponent?
mx.controls.Alert базируется на Panel. Чесно говоря, сомнительное решение, т.к. в 99% случаев функционал контейнера (коим по-сути является Panel) для Alert не востребован. Многие из вас добавляли в Alert что нибудь динамически? А если добавляли, то было ли это вызвано необходимостью, а не нуждой?
После осмысления всего этого, был выбран SkinnableComponent, как базовый по-функционалу и не содержащий лишнего.
В контейнерах есть единственный функционал, который нам понадобится – это свойство defaultButton. Поэтому, добавим его в наш компонент:
private var _defaultButton:IFlexDisplayObject; public function get defaultButton():IFlexDisplayObject { return _defaultButton; } public function set defaultButton(value:IFlexDisplayObject):void { _defaultButton = value; ContainerGlobals.focusedContainer = null; }
Нужна для установки фокуса на кнопку, ссылка на которую хранится в _defaultButton.
Дабы эта вся красота заработала прийдется реализовать интерфейс IFocusManagerContainer.
Как раз в нем и описаны геттер и сеттер defaultButton.
Есть еще один важный момент. Для размещения кнопок используется контейнер controlBarGroup:Group. Я использовал именно Group, вместо GroupBase, из-за его свойства mxmlContent, в связи с чем добавление кнопок в группу удалось свести к одной строчке:
Где _buttons предварительно сформированный на основе флагов массив.
Об этом следует помнить, если кто нибудь решит использовать самописную группу в скине.
В связи с таким решением пришлось добавить очистку группы при смене скина.
override protected function partRemoved(partName:String, instance:Object):void { super.partRemoved(partName, instance); if (instance == controlBarGroup) { controlBarGroup.removeAllElements(); } }
Что же в итоге получилось?
Сделаем простенький скин (дабы не нагружать простынями кода, примеры выложу вместе с исходниками), прописываем стиль:
Код:
<fx:Style> @namespace s "library://ns.adobe.com/flex/spark"; @namespace mx "library://ns.adobe.com/flex/mx"; @namespace components "alatar.components.*"; components|Alert { skinClass: ClassReference("alatar.skins.AlertSkin1"); } </fx:Style>
Alert.show("I custom alert", "Custom Alert", Alert.OK | Alert.CANCEL, this, null, Alert.OK);
Не впечатляет? Ничем не отличается от стандартного?
Усложним:
Такое уже труднее реализовать в стандартном компоненте. Ну и что бы добить:
В итоге, мы получили полный контроль над видом Alert используя только mxml, не загромождая основной код лишней писаниной и не куроча стандартные компоненты.
Собственно исходники с примером.
Всего комментариев 13
Комментарии
03.12.2010 00:29 | |
Интересно, спасибо.
А не скажете, что можно почитать для начала отстающим в развитии Flex'а? А то я не все понимаю пока =) |
03.12.2010 01:00 | |
A вставить scale-9 шкурку на фон и кастомную кнопку можно?
|
03.12.2010 01:42 | |
Забыл вставить лицензию. Думаю MIT всех устроит? Еще добавлю стиль для скинирования кнопок. Когда добавлю отпишусь в комментариях. Не забудьте заново скачать исходники. В этом виде их не получится использовать в коммерческих проектах.
|
|
Обновил(-а) alatar 03.12.2010 в 17:16
|
03.12.2010 03:32 | |
Цитата:
В этом виде их не получится использовать в коммерческих проектах.
|
03.12.2010 10:10 | |
Ну для многих и присутствие не влияет
|
03.12.2010 12:03 | |
Крутяк, молодец. Помню как приходилось пилить mx'совский Alert чтобы нужный вид придать.
|
03.12.2010 12:24 | |
Цитата:
Ну для многих и присутствие не влияет
1. Хочешь выложить код? Выкладывай и пусть делают с ним что хотят. Не хочешь чтобы меняли? Не выкладывай. И не надо никаких лицензий. 2. Писать надо нормальным языком, а не только юридическим. Мне как-то надо было понять смысл одной лицензии. Перерыл весь интернет, так и не понял о чем шла речь, что можно, а что нельзя. Было бы не плохо, если бы кто-то написал про это статью. А отсутствие не влияет... на форуме столько кода навалено в помощь, представляю, если бы для каждого фрагмента вставляли лицензию. |
|
Обновил(-а) iNils 03.12.2010 в 12:28
|
03.12.2010 13:57 | |
Надо написать в правилах форума: " Выложенный на форуме код является общественным достоянием (ну или MIT/BSD какой-нить) если иные правоограничения не описаны дополнительно".
|
03.12.2010 22:58 | |
01.11.2012 12:59 | |
yesLabel & noLabel не лишними будут
|
Последние записи от alatar
- Трансформации вокруг произвольной точки (05.02.2015)
- Декомпозиция матрицы. (25.12.2014)
- Баги TextField в iOS (29.07.2013)
- [Spark] Стрелочный индикатор. (06.12.2012)
- RSLs Monkey Patching (23.01.2012)