Как и ранее обещал, начинаю рубрику полезных советов, наблюдений и уклонов от граблей. Поехали.
Есть форма построенная на собственной разработки UI компонентах, очень любимых нами, или может даже с помощью стандартных компонентов, которые кстати очень даже качественно написаны. И при отправке формы, или при каких либо других действиях требующих от нас временного блокирования формы кто то возможно попробует перебрать список UI компонентов, и если это наши компоненты вызвать некий метод ui.active = false, или если стандартные, то ui.enabled = false. Но такая операция трудоемкая, совсем никому не нужный лишний цикл, плюс ко всему ошибки, если форма сложная, то еще и проверки. Так вот, делать это все не надо, потому как есть намного изящный и на порядок более быстрый подход, а так же из-за простоты реализации еще и снижающий вероятность ошибки. Для блокировки форм, и любых других интерактивных объектов, лучше всего использоваться Sprite. Если необходимо показать какое то модальное окно, то просто добавляем на Stage, наш блокирующий слой, у меня как правило он называется незамысловато _blockLayer. Блокирующий слой заливается посредством Graphics любым цветом с полной прозрачностью и не одно MouseEvent событие не пройдет сквозь блокирующий слой. А еще более быстрый способ, это не использовать Alpha, а использовать BlendMode. Так же закрашиваем блокирующий слой черным (кто не знает, это 0 или умнее 0х000000), и ставим _blockLayer.blendMode = BlendMode.ERASE.
Отдавайте предпочтение маскам реализованным за счет Rectangle, т.е. anyDisObject.scrollRect = new Rectangle(0,0,100,50). Но не забывайте, для премущества от ScrollRect необходимо маскируемый объект кэшировать как изображение cacheAsBitmap = true. Есть несколько неудобств при использовании ScrollRect – при перемещении, необходимо постоянно обновлять прямоугольник anyDisObject.scrollRect = _dynamicRectangleRef, ну и естественно, что бы не создавать каждый раз новый объект, правильно изначально создать Rectangle, и менять нужные нам параметры: x, y, width, height.
Перед удаление объекта с Display List, сделайте объект невидимым, objToDelete.visible = false. Освободите немного памяти, которой всегда нехватает.
Если ссылке на объект типа Sound назначить null, то тяжелый объект будет сразу высвобожден с памяти.
Произошли большие изменения, я покинул старый и бесплатный домен nicolas.org.ua, и приобрел nicolasprof.com. Теперь будет приятно организовывать иерархию пэкеджей. В связи с этим событием я готовлю PROFGallery 2.2 в которой многие вещи будут переписаны на более «правильный» лад, для более качественного и удобного сопровождения проекта, уже сейчас разрабатывается новый engine эффектов. Так же я создам новую категорию под названием «Опыт» в которой буду делиться опытом в тезисной форме, т.е. это не будут трактаты на пару страниц… После PROFGallery планирую плотно заняться PROFScript, и все же предоставить общественности релиз версию.
P.S.
Это сообщение было посвященно тем двум, трем людям, которые изредка посещают мой блог)
Очень давно хотел провести тест на предмет того, как влияет на производительность параметр visible, а так же добавление и удаление объекта из Display List’а.
В тесте используется объект который имеет сложный вектор, тысячи точек. Объект можно удалять/добавлять в Display List, а так же запустить анимацию, и провести те же операции.
После этого теста, очевидна польза visible (освобождение памяти) параметра, удаление из Display List’а спасает лишь в случаи с анимацией (хотя и это было так же интересно, будет ли какая то нагрузка, если объекта нет в дисплей листе).
После работы с классом отражения от AFComponents, стало очевидно чего не хватает в отличном отражении. Что мне понравилось в AFComponents варианте: отражение наследуется от спрайта, что дает пользователю возможность контролировать получаемый результат. Не понравилось, подход к созданию отражения, ну и реализация. Так же на практике, дизайнеры очень хотят видеть размытое отражение, что тоже необходимо учитывать.
В итоге вышел следующий инструмент:
Reflect наследуется от Sprite;
объект для отражения, может иметь различные модификаторы трансформации, scale, skew, rotate, так же совершенно не важно где находится registration point;
добавлен метод applyFilter, позволяет применять массив фильтров к Bitmap отражения;
добавлен class ReflectVars;
Специально для демо выбрал героя by TemplateMonster, который был увеличен (ScaleX, ScaleY), а так же двигается вне стартовых значений габаритов Movieclip