![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Для доступа к вложенным объектам (детям) в XML вы можете использовать оператор точка (.) (XML dot operator). Пример:
Результат: Это аналогично использованию метода elements (XML.elements()). Однако, есть еще похожий оператор две точки (..) (descendant accessor operator). Который работает аналогично, но возвращает и объекты более глубокого уровня вложенности. Пример: var myXML:XML =
<note>
<replying-to>
<note>
<author>Julie</author>
<title>Reminder</title>
<body>Take out the trash</body>
</note>
</replying-to>
<author>Kevin</author>
<title>Re: Reminder</title>
<body>I will.</body>
</note>;
trace("Children:");
trace(myXML.author.toXMLString());
trace("Decendants:");
trace(myXML..author.toXMLString());
Есть и специальный метод, который выполняет ту же задачу decendants (XML.descendants()). |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
В классе Array (Top level Array) добавлены новые методы indexOf и lastIndexOf.
AS3 function indexOf(searchElement:*, fromIndex:int = 0):int AS3 function lastIndexOf(searchElement:*, fromIndex:int = 0x7fffffff):int |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Для создания ссылок в текстовом поле, клик по которым можно программно отловить, теперь нужно использовать слово event (flash.text.TextField.event:link), а не asfunction как это было в ActionScript 1 и 2. Кроме того, event теперь не вызывает указанную функцию а создает событие TextEvent (flash.events.TextEvent) с типом TextEvent.LINK, а в свойство text записывается текст указанный в ссылке после слова event.
Пример: |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Помимо создания динамических свойств и методов в Proxy (flash.utils.Proxy) есть возможность управлять порядком перечисления свойств в циклах for..in и for each..in. Для этого используются методы класса:
1) предоставляет порядковый номер для nextName и nextValue (если возвращаемое значение >0), или 2) прерывает цикл (если возвращаемое значение равно нулю). При начале цикла nextNameIndex получает порядковый номер равный нулю. Каждое последующее значение возвращаемое nextNameIndex отлично от нуля и передается методам nextName и nextValue. Если nextNameIndex возвращает ноль, то цикл заканчивается. К примеру, proxy имеет 3 свойства (x,y,visible), попробуем их перечислить в цикле for..in Здесь будут вызываться методы nextNameIndex и nextName: for (var prop:String in proxy) {
[ proxy.nextNameIndex(0) -> return 1 ]
[ proxy.nextName(1) -> return "x" ]
[ prop = "x" ]
trace(prop); // x
(end for block, repeat)
[ proxy.nextNameIndex(1) -> return 2 ]
[ proxy.nextName(2) -> return "y" ]
[ prop = "y" ]
trace(prop); // y
(end for block, repeat)
[ proxy.nextNameIndex(2) -> return 3 ]
[ proxy.nextName(3) -> return "visible" ]
[ prop = "visible" ]
trace(prop); // visible
[ proxy.nextNameIndex(3) -> return 0 ]
(0 index, break from for block)
}
Поскольку в циклах используется порядковый номер, то удобно хранить динамические свойства в массиве и в методах nextName или nextValue просто вернуть элемент массива index-1 (поскольку nextName и nextValue никогда не получают порядкового номера 0). Создадим прокси-класс, который реализует пример выше. Помните, что методы proxy определены в пространстве имен flash_proxy. package {
import flash.utils.Proxy;
import flash.utils.flash_proxy;
public class ProxyEnum extends Proxy {
private var props:Array = ["x", "y", "visible"]; // массив свойств
// nextNameIndex вызывается при начале итерации в цикле
override flash_proxy function nextNameIndex (index:int):int {
if (index < props.length) {
// первый вызов 0, возвращаем 1 + index
// т.е. порядковый номер будет 1, затем 2, 3
return index + 1;
} else {
// все свойства перечислены для прерывания цикла
// возвращаем 0
return 0;
}
}
// nextName вызывается после nextNameIndex и порядковый номер начинается с 1
override flash_proxy function nextName(index:int):String {
// возвращаем элемент массива index – 1
return props[index - 1];
}
}
}
var proxy:ProxyEnum = new ProxyEnum();
for (var prop in proxy) {
trace(prop);
}
/* output:
x
y
visible
*/
package {
import flash.display.DisplayObject;
import flash.utils.Proxy;
import flash.utils.flash_proxy;
public class ProxyEnum extends Proxy {
private var props:Array = ["x", "y", "visible"]; // массив свойств
private var _target:DisplayObject;
function ProxyEnum(target:DisplayObject) {
_target = target;
}
// nextNameIndex вызывается при начале итерации в цикле
override flash_proxy function nextNameIndex (index:int):int {
if (index < props.length) {
// первый вызов 0, возвращаем 1 + index
// т.е. порядковый номер будет 1, затем 2, 3
return index + 1;
} else {
// все свойства перечислены для прерывания цикла
// возвращаем 0
return 0;
}
}
// nextName вызывается после nextNameIndex и порядковый номер начинается с 1
override flash_proxy function nextName(index:int):String {
// возвращаем элемент массива index – 1
return props[index - 1];
}
// nextValue вызывается после nextNameIndex в циклах for each..in
override flash_proxy function nextValue(index:int):* {
// получаем название свойства из массива
var prop:String = props[index - 1];
// и возвращаем его значение
return _target[prop];
}
// возвращает значение свойства по его имени
override flash_proxy function getProperty(name:*):* {
return _target[name];
}
}
}
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
MerlinTwi: Поскольку этот совет (Event Capturing and mouseEnabled) в оригинале практически дублирует (72. mouseEnabled и блокирование событий), видимо senocular где-то ошибся, то я сам расскажу еще про mouseEnabled.
К примеру, создаем класс текстовой кнопки, есть фоновый мувиклип, который растягивается под ширину текста и сверху на него накладывается текст (TextField). Если обработчики событий от мышки (MOUSE_OVER, MOUSE_OUT, CLICK) добавить к фоновому мувиклипу, то события будут срабатывать только на краях кнопки, где нет текста. Это происходит потому, что все интерактивные отображаемые объекты создаются по умолчанию с mouseEnabled=true, т.е. реагируют на события от мышки, а как было показано в предыдущих советах событие от мышки получает только самый верхний объект на сцене. Поэтому в таких случаях нужно не забывать запрещать текстовому полю перехватывать события от мышки: А вообще, при создании кнопки лучше сделать: Последний раз редактировалось MerlinTwi; 09.11.2006 в 23:00. |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Работая с XML в ActionScript 3 вы в основном имеете дело с двумя объектами: XML (Top level XML) и XMLList (Top level XMLList). Существенная разница между ними в том, что XML – это один элемент XML-дерева, например узел (который может содержать произвольное количество вложенных узлов), а XMLList массив элементов (1 или более).
В первом примере есть один корневой узел и это будет представлено как XML объект. Во втором примере список узлов, это уже будет XMLList. В отличие от старого XML объекта из предыдущих версий ActionScript (который теперь XMLDocument), новые XML и XMLList могут представлять из себя не только узлы XML дерева (nodes), но и другие значения, например атрибуты: var myXML:XML = <foo>
<foo bar="bar1" />
<foo bar="bar2" />
<foo bar="bar3" />
</foo>;
trace(myXML.foo.@bar.toXMLString());
/* Output:
bar1
bar2
bar3
*/
trace(myXML.foo.@bar is XMLList); // true
Для того чтобы получить XML объект, нужно из возвращаемого массива взять первый элемент: Аналогичная ситуация и с вложенными узлами XML: |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Код ActionScript выполняется во flash-плеере в специальной «виртуальной машине», для ActionScript 1 и 2 это была AVM1, для ActionScript 3 была разработана новая AVM2. Нет возможности напрямую взаимодействовать между программами выполняющимся в разных виртуальных машинах, поскольку они несовместимы. К примеру, если в мувик созданный на ActionScript 3 загрузить внешний мувик из ActionScript 1 или 2, то не удастся напрямую управлять им: запустить, остановить, вызвать функцию, считать значение свойства и т.п.
Но можно создать специальный канал для взаимодействия при помощи LocalConnection, используя:Пример: // файл на ActionScript 2: AS2animation.fla
// на timeline размещен один мувиклип названный animation_mc
//Устанавливаем local connection для получения команд извне
var AVM_lc:LocalConnection = new LocalConnection();
// обработчик события stopAnimation
AVM_lc.stopAnimation = function(){
animation_mc.stop();
}
// слушаем события по каналу "AVM2toAVM1"
AVM_lc.connect("AVM2toAVM1");
// Файл на ActionScript 3: AS3Loader.fla
// local connection для взаимодействия с мувиклипом в AVM1
var AVM_lc:LocalConnection = new LocalConnection();
// загружаем внешнюю SWF AVM1
var loader:Loader = new Loader();
loader.load(new URLRequest("AS2animation.swf"));
addChild(loader);
// при клике мышкой по загруженному мувиклипу вызывается stopPlayback
loader.addEventListener(MouseEvent.CLICK, stopPlayback);
function stopPlayback(event:MouseEvent):void {
// вызывается stopAnimation по каналу "AVM2toAVM1"
AVM_lc.send("AVM2toAVM1", "stopAnimation");
}
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
В ActionScript 3 добавлена возможность работать с бинарными данными, используя класс ByteArray (flash.utils.ByteArray). Класс ByteArray наследуется от массива Array (Top level Array) и может содержать в себе байты любой бинарной информации, аналогично тому, как она размещена в памяти компьютера. Работать с классом довольно просто, поэтому лучше посмотреть примеры, что можно с его помощью сделать:
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
В аттаче все советы в html формате (можно добавить на свой сайт)
|
|
|||||
|
Регистрация: Dec 2007
Сообщений: 2
|
Подскажите, пожалуйста, как временно запомнить только что нарисованную картинку для последующего ее изменения в movie clip (например, заставить вращаться)
|
![]() |
![]() |
Часовой пояс GMT +4, время: 01:44. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|