Search

Rss Posts

Rss Comments

Login

 

Using DisplayObject’s contains() method

Сен 12

А знаете ли вы, что у любого DisplayObject‘a можно узнать не содержит ли он уже некоторый другой DisplayObject?

Для этого он имеет метод contains():

flash.display.DisplayObjectContainer.
∟ contains(child:DisplayObject):Boolean

Смотрите пример, доступен просмотр кода.

Flex XML, XMLList и XMLListCollection

Сен 10

Flex содержит целых три класса для работы с XML-объектами: XML, XMLList, XMLListCollection. На первый взгляд необходимость такого разнообразия не очевидна.

Класс XML дает нам возможность работать с xml-данными по стандарту E4X, что есть чрезвычайно удобно. Ведь мы можем проходить по элементам xml-объекта как по массиву: company2.employee[1].name, или обращаться к элементу с заданными параметрами (поиск): company2.employee.(name==’Employee6′).email. Смотрите в примере.

При этом xml-объект должен быть правильно сформированным: содержать один общий для всех корневой элемент (root node). Например:

<employers>

<employee>

<name>Employee4</name>

<email>employee4@company2.com</email>

</employee>

<employee>

<name>Employee5</name>

<email>employee5@company2.com</email>

</employee>

</employers>

В данном случае, корневым элементом является «employers». Вы можете конвертировать строку, приведенную выше в XML объект, но если бы эта строка не содержала корневого элемента, получили бы ошибку. См. пример.

Для тех целей, когда вам необходимо просто иметь xml-структурированные данные, и нет нужды (или возможности) в «well formatted» xml документе, вам дана возможность использовать класс XMLList. Само название говорит за себя: список xml документов. Например, нижеприведенная строка есть валидный XMLList объект:

<employee>

<name>Employee4</name>

<email>employee4@company2.com</email>

</employee>

<employee>

<name>Employee5</name>

<email>employee5@company2.com</email>

</employee>

Т.е. говоря по-русски, просто нет корневого элемента. Таким образом, класс XMLList содержит произвольные XML данные, что на практике очень удобно.

А зачем же тогда root node вообще нужен? В нем вы можете задавать пространства имен, используемых в документе. Например, во Flex’e мы используем пространство xmlns:mx=”http://www.adobe.com/2006/mxml”, это гарантирует нам уникальность имен классов библиотеки Flex с другими библиотеками совместно используемых в одном документе.

Теперь о XMLListCollection. Вы знаете, что Flex предоставляет нам в пользование два замечательных класса т.н. «коллекций данных»: ArrayCollection, XMLListCollection. Это сложные, составные объекты данных, позволяющие нам манипулировать как одним целым. Помимо других очень важных и полезных свойств (например, итерации), эти классы добавляют возможность публикации события CollectionEvent.COLLECTION_CHANGE. Это делает объект XMLListCollection доступным для связывания (Binding). Так, в нашем примере, для связывания компоненты txt1 класса Text с ее свойством text объекта company1 класса XMLList мне пришлось использовать явное связывание:

<mx:Binding destination=”txt1.text” source=”company1″ />

Я не мог использовать связывание через фигурные скобки (curly braces), поскольку класс XMLList не наследует класс EventDispatcher. Если бы я имел в своем приложении объект класса XMLListCollection:

<mx:XMLListCollection id=”xmlLC” />

То я бы смог привязаться к ней через фигурные скобки:

<mx:Text id=”txt1″ text=”{xmlLC}”/>

Источником данных для XMLListCollection является XMLList, но не XML.

Итак, резюмируя можно сказать, что если вам нужен xml-объект и при этом он не является каким-то регламентированным форматом данных (например, SOAP), используйте XMLList.

Пару слов о методе toString() и toXMLString(). Если xml объект является комплексным, т.е. содержит хотя бы один дочерний элемент, то метод toString() вернет тоже что и toXMLString(). Пример:

1).

private var xml:XML = <root name=’hi’></root>;

trace (xml.toString()); // покажет ”

trace (xml.toXMLString()); // покажет ‘<root name=”hi”/>’

2).

private var xml:XML = <root name=’hi’><hello /></root>;

trace (xml.toString()); // покажет ‘<root name=”hi”><nello/></root>’

trace (xml.toXMLString()); // покажет ‘<root name=”hi”><nello/></root>’

 

Для объекта класса XMLList метод toString() запускается для каждого дочернего XML объекта.

Смотрите также пример для данной статьи. Доступен просмотр кода.

How to grab shapshot from UI component in Flex

Авг 24

Как получить копию экрана или компонента в картинке.

В третьем флексе есть замечательный класс mx.graphics.ImageSnapshot. Работать с ним лекго. Он умеет кодировать в PNG и JPG, а также ресемплировать картинку до нужного DPI. При чем делает это по-умному: сначала растягивает компонент (где-то там у себя в памяти), а потом делает снимок. Т.е. все векторные объекты сохраняют свою четкость.

var snapshot:ImageSnapshot = ImageSnapshot.captureImage(component, dpi.value, new PNGEncoder());

Заметьте, что таким способом у вас не получится снять картинку размером более 2880х2880

Смотрите пример: http://flexpower.in.ua/examples/imagesnapshot/index.html

Доступен просмотр кода. Enable source view.