понедельник, декабря 31, 2007
Всех с Новым годом!
среда, декабря 26, 2007
Tree vertical-scroll баг
При открытии нода дерева с сервера приходят данные об его дочерних элементах, изменяется этот узел датапровайдера, дети отображаются. Все вроде бы ничего, но если по высоте элементы не влезают в дерево, вертикальный скроллинг появляется только после повторного открытия нода (когда он уже знает о своих детях).
Решение - использовать кастомный dataDescriptor. Нашел в блоге Joan Lafferty здесь.
Бажное приложение:
treeScrollAuto.mxml
treeScrollAuto.swf
Решение:
treeScrollAutoFixed.mxml
myDescriptor.as
treeScrollAutoFixed.swf
среда, декабря 05, 2007
Девайс от Nokia с девятым флеш-плеером
Скринкаст Papevision3D 2.0
четверг, ноября 29, 2007
пятница, ноября 23, 2007
Онлайн-сервис для трассировки изображений в вектор
вторник, ноября 13, 2007
Новый Flex - новые чарт-компоненты
четверг, ноября 01, 2007
Flare visualization toolkit
Скачать
Демо
Урок
API докуметация
понедельник, октября 29, 2007
AIR SQLite Admin от Коэнратса
Mozilla представляет Prizm - симбиоз веба и десктопа
Как говорят разработчики, это не новая платформа, а просто полезное совмещение декстопных приложений, построенный с помощью XUL (XML User Interface Language) и современных веб-технологий. Если вкратце - Prizm позволяет добавлять ваши любимые веб-приложения на десктоп и запускать их оттуда.
Новость интересная. Даже адобы в комментах начали к словам придираться. Пойду качать и разбираться.
UPDATE: Вот более подробная инфа.
вторник, октября 23, 2007
Экспорт из DataGrid в Excel через буфер
private function exportToExcel(dg:DataGrid, fields:Array):void
{
var dp:ArrayCollection = dg.dataProvider as ArrayCollection;
if (dg == null || dp==null || dp.length==0 || fields == null || fields.length==0) {
Alert.show("Ошибка экспорта.");
return;
}
var i:int;
var j:int;
var l_dp:int = dp.length;
var l_f:int = fields.length;
var result:String = "";
for (i=0; i<l_f; i++)
{
result += fields[i][1];
if (i!=(l_f-1)) result+='\t';
}
result +='\r\n';
for (i=0; i<l_dp; i++)
{
for (j=0; j<l_f; j++)
{
var prop:String = fields[j][0];
var l_col:int = dg.columns.length;
var k:int;
for (k=0; k<l_col; k++)
{
if (prop == dg.columns[k].dataField)
{
break;
}
}
var f:Function = dg.columns[k].labelFunction;
if (f != null)
{
result += f(dp[i], dg.columns[k]);
}
else result += dp[i][prop];
if (j!=(l_f-1)) result+='\t';
}
result +='\r\n';
}
System.setClipboard(result);
}
Вызываем так:
exportToExcel(grd,
[['title','Заголовок'], ['rank','Рейтинг'],
['views', 'Просмотров'],['comp', 'Конкурсы'],
['access', 'Доступность'], ['pics','Количество изоб-й']])
,grd - id нашего DataGrid, а делее идет массив с dataField и заголовками колонок.
При экспорте также учитывается labelFunction. После выполнения функции данные можно смело вставлять в таблицу Excel.
Свежие видео-уроки от GotoAndLearn.com
- Вебкамеры, PNG и AIR
- Использование Document Class
- Drag and Drop в AIR
- Разработка AIR во Flash
- Основы Papervision3D
Все уроки подробные и понятные. Язык не обязателен - каждый шаг показан на видео, вплоть до того, как автор набивает код и исправляет ошибки:)
вторник, октября 16, 2007
Случайная ошибка flash.accessibility
TypeError: Error #2007: Parameter source must be non-null.
at flash.accessibility::Accessibility$/sendEvent()
Случайную галочку пришлось снять:)
среда, октября 10, 2007
SWFObject 2.0 или правильное внедрение Flash на HTML страницу
Как внедрить Flash контент с помощью совместимой со стандартами html-разметки? (1 способ)
ШАГ 1: Внедрение Flash контента и альтернативного контента с помощью совместимой со стандартами html-разметки
SWFObject использует в качестве разметки метод вложенных тегов object с условными комментариями, поддерживаемыми Internet Explorer [http://www.alistapart.com/articles/flashembedcagematch/] , чтобы обеспечить наиболее оптимальную кросс-браузерную поддержку, совместимость со стандартами и наличие альтернативного контента [http://www.swffix.org/testsuite/]:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject v2.0 - step 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<div>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420">
<param name="movie" value="myContent.swf" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420">
<!--<![endif]-->
<p>Alternative content</p>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
</div>
</body>
</html>
Заметка 1: Метод вложенных тегов object требует двойное их определение(внешний тег для Internet Explorer и внутренний для остальных браузеров), таким образом задавать все атрибуты и параметры необходимо дважды.
Заметка 2: Атрибуты id, classid, элемент param с movie используются для внешнего object. Атрибуты type и data используются только для внутреннего.
Заметка 3: Мы не рекомендуем использовать атрибут codebase для задания пути к установщику Flash плагина с серверов Adobe, потому что это запрещено согласно спецификации, которая ограничивает его доступ доменом текущего документа. Вместо этого мы предлагаем использовать альтернативный контент с сообщением о возможности загрузки плагина и соответствующей ссылкой.
Как можно использовать HTML для конфиграции Flash контента?
Можно задать следующие атрибуты [http://www.w3schools.com/tags/tag_object.asp] элементу object:
- id
- name
- class
- align
Можно задать следующие элементы param [http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_12701]:
- play
- loop
- menu
- quality
- scale
- salign
- wmode
- bgcolor
- base
- swliveconnect
- flashvars
- devicefont [http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_13331]
- allowscriptaccess [http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_16494]
- seamlesstabbing [http://www.adobe.com/support/documentation/en/flashplayer/7/releasenotes.html]
- allowfullscreen [http://www.adobe.com/devnet/flashplayer/articles/full_screen_mode.html]
- allownetworking [http://livedocs.adobe.com/flash/9.0/main/00001079.html]
Почему необходимо использовать альтернативный контент?
Элемент object позволяет размещать альтернатиный контент, который будет показан, если Flash плеер не установлен или не поддерживается. Этот контент также виден для поисковых машин, что немаловажно для SEO.
Недостатки использования метода вложенных объектов?
При более тщательном рассмотрении кросс-браузерности приведенной выше разметки, вы увидите следующие проблемы:
- Safari 1.2.2 и ниже игнорирует все вложенныеэлемены param
- Internet Explorer 6+ под Windows XP SP2+ и Opera 9+ будут использовать механизм активации Flash контента по клику.
- Присутствует риск некорректного отображения (или неотображения вовсе) Flash контента в плеере версии ниже необходимой
Библиотека SWFObject старается решить эти проблемы.
ШАГ 2: Внедрение библиотеки SWFObject в HTML страницу
Библиотека SWFObject состоит из внешнего JavaScript файла (размер: 9.8Kb, GZIPed: 3.3Kb).
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject v2.0 - step 2</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="swfobject.js"></script>
</head>
<body>
<div>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420">
<param name="movie" value="myContent.swf" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420">
<!--<![endif]-->
<p>Alternative content</p>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
</div>
</body>
</html>
ШАГ 3: Конфигурация Flash контента через библиотеку SWFObject
Сначала необходимо задайть уникальный id внешнего тегу object. Затем добавьте метод swfobject.registerObject:
- Первый аргумент (String, необходим) - это id объекта, заданный ранее.
- Второй аргумент (String, необходим) определяет версию Flash плеера, под которую опубликован ваш ролик. SWFObject смотрит только на первые три цифры версии, например, "9.0.18".
- Третий аргумент (String, опциональный) может быть использован для активации экспресс-установки плеера [http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75] и задает адрес swf-файла экспресс-установки. Данный файл включен в библиотеку SWFObject.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject v2.0 - step 3</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
swfobject.registerObject("myId", "9.0.0", "expressInstall.swf");
</script>
</head>
<body>
<div>
<object id="myId" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420">
<param name="movie" value="myContent.swf" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420">
<!--<![endif]-->
<p>Alternative content</p>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
</div>
</body>
</html>
Как внедрить несколько SWF файлов с помощью первого способа?
Просто повторите шаги 1 и 3 предыдущего радела.
Как ссылаться на активный элемент object с помощью JavaScript (используя первый способ)?
Одним из сторонних эффектов использования метода вложенных объектов является то, что на один SWF существуют два элемента object, но задавать можно только один уникальный атрибут id или name.
Разные браузеры указывают на разные элементы object:
- Internet Explorer на Windows видит только внешний object, так как внутренний закоментирован для него.
- Opera и Safari поддерживают нотацию внутреннего object [http://www.swffix.org/testsuite/], ряд: object ActiveX)
- Firefox, Mozilla and all other Gecko based browsers use the inner object
На активный объект можно сослаться через:
- Атрибут id или name внешнего тега
- С помощью следующего javascript-кода:
var obj = document.getElementById("myId");
var nestedObj = obj.getElementsByTagName("object")[0];
var ref = false;
if (obj) {
if (!nestedObj || (nestedObj && typeof obj.SetVariable != "undefined")) {
ref = obj;
}
else if (typeof nestedObj.SetVariable != "undefined") {
ref = nestedObj;
}
}
if (ref) {
ref.doSomething(); // например, вызов external interface
}
Как с помощью SWFObject динамически внедрять Flash контент? (второй способ)
ШАГ 1: Создание алтернативного контента с помощью стандартной html-разметки
Метод динамического внедрения следует принципу постепенного улучшения[http://www.adobe.com/devnet/flash/articles/progressive_enhancement.html] и замещает альтернативный HTML контент Flash контентов, если JavaScript и Flash плагины поддержтваются. Сперва создайте альтернативный контент с уникальным id:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject v2.0 dynamic embed - step 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<div id="myContent">
<p>Alternative content</p>
</div>
</body>
</html>
ШАГ 2: Внедрение библиотеки SWFObject в HTML страницу
Библиотека SWFObject состоит из внешнего JavaScript файла (размер: 9.8Kb, GZIPed: 3.3Kb).
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject v2.0 dynamic embed - step 2</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="swfobject.js"></script>
</head>
<body>
<div id="myContent">
<p>Alternative content</p>
</div>
</body>
</html>
ШАГ 3: Внедрение SWF с помощью JavaScript
swfobject.embedSWF(swfUrl, id, width, height, version, expressInstallSwfurl, flashvars, params, attributes) has five required and four optional arguments:
- swfUrl (String, необходим) - URL SWF файла
- id (String, необходим) - id HTML элемента, содержащего альтернативный контент, который будет замещен Flash контентом
- width (String, необходим) - ширина SWF файла
- height (String, необходим) - высота SWF файла
- version (String, необходим) - версия публикации SWF файла
- expressInstallSwfurl (String, опцианален) - адрес файла экспресс-установки необходимой версии [http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75]
- flashvars (Object, опцианален) - переменные flashvars в виде name:value пар
- params (Object, опцианален) - параметры вложенного элемента object в виде name:value пар
- attributes (Object, опцианален) - атрибуты object в виде name:value пар
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject v2.0 dynamic embed - step 3</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0");
</script>
</head>
<body>
<div id="myContent">
<p>Alternative content</p>
</div>
</body>
</html>
Конфигурация Flash контента
Можно задать следующие атрибуты [http://www.w3schools.com/tags/tag_object.asp] элементу object:
- id
- name
- class
- align
Можно задать следующие элементы param [http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_12701]:
- play
- loop
- menu
- quality
- scale
- salign
- wmode
- bgcolor
- base
- swliveconnect
- flashvars
- devicefont [http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_13331]
- allowscriptaccess [http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_16494]
- seamlesstabbing [http://www.adobe.com/support/documentation/en/flashplayer/7/releasenotes.html]
- allowfullscreen [http://www.adobe.com/devnet/flashplayer/articles/full_screen_mode.html]
- allownetworking [http://livedocs.adobe.com/flash/9.0/main/00001079.html]
Как с помощью объектов JavaScript задавать flashvars, params и атрибуты object?
Создаем соответствующие объекты:
<script type="text/javascript">
var flashvars = {};
var params = {};
var attributes = {};
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);
</script>
Добавляем пары name:value:
<script type="text/javascript">
var flashvars = {
name1: "hello",
name2: "world",
name3: "foobar"
};
var params = {
menu: "false"
};
var attributes = {
id: "myDynamicContent",
name: "myDynamicContent"
};
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);
</script>
Или с помощью точечной нотации:
<script type="text/javascript">
var flashvars = {};
flashvars.name1 = "hello";
flashvars.name2 = "world";
flashvars.name3 = "foobar";
var params = {};
params.menu = "false";
var attributes = {};
attributes.id = "myDynamicContent";
attributes.name = "myDynamicContent";
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);
</script>
Или для однострочников:
<script type="text/javascript">
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", {name1:"hello",name2:"world",name3:"foobar"}, {menu:"false"}, {id:"myDynamicContent",name:"myDynamicContent"});
</script>
Если вы не хотите использовать аргумент задайте ему значение 'null' или сотавьте пустой объект:
<script type="text/javascript">
var flashvars = null;
var params = {};
var attributes = {
id: "myDynamicContent",
name: "myDynamicContent"
};
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);
</script>
Объект flashvars можно задать внутри params:
<script type="text/javascript">
var flashvars = null;
var params = {
menu: "false",
flashvars: "name1=hello&name2=world&name3=foobar"
};
var attributes = {
id: "myDynamicContent",
name: "myDynamicContent"
};
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);
</script>
Как внедрить несколько SWF файлов с помощью второго способа?
Просто повторите шаги 1 и 3 предыдущего радела.
Как с помощью SWFObject получить информацию о Flash плеере через JavaScript?
swfobject.getFlashPlayerVersion() - возвращает JavaScript объект, содержащий версию (major:Number), (minor:Number), (release:Number) установленного плеера:
var playerVersion = swfobject.getFlashPlayerVersion();
var majorVersion = playerVersion.major;
swfobject.hasFlashPlayerVersion(versionNumbersString) - возвращает Boolean, показывающий установлена или нет сооветствующая версия:
if (swfobject.hasFlashPlayerVersion("9.0.18")) {
// есть
}
else {
// нет
}
Риски использования SWFObject?
Первый способ
Пользователи, у которых выключен или не поддерживается в браузерах JavaScript, увидят некорректное отображение или ничего не увидят вообще. Подсчитаем убытки:
- 4% всех пользователей не дружат с JavaScript [ http://www.thecounter.com/stats/2007/June/javas.php].
Второй способ
Пользователи, у которых выключен или не поддерживается в браузерах JavaScript, увидят альтернативный контент.
- 4% всех пользователей не дружат с JavaScript [http://www.thecounter.com/stats/2007/June/javas.php].
Поддерживает ли SWFObject MIME тип application/xhtml+xml?
Нет.
понедельник, октября 08, 2007
Полезные плагины для FlashDevelop
- BookmarkPanel
- AsClassWizard
- FlashApi
- SourceOptions
- StickiesNotes
- CodeReformatter
- RegularExpressionPanel
- SharedObjectReader
Кстати, устанавливать плагины нужно в папку userdir\Local Settings\Application Data\FlashDevelop. Но не торопитесь свалить все сразу. Лучше по одному, потому что я словил 3 ошибки на запуске (но все пашет) и сейчас не могу понять, кто в этом виноват:)
понедельник, октября 01, 2007
Adobe представляет Flash Player 10 "Astro"
Вот что обещают:
1. Улучшенная работа с текстом
2. "Hydra" - язык написания собственных Bitmap-фильтров.
3. Поддержка 3D. Как говорят очевидцы - разочаровало. Позволяет искажать битмапы в перспективе. 3D теперь software based. Появляются новые свойства типа rotationX, rotationY и rotationZ. В качестве примера было показано видео, которое проигрывалось на плоскости, по которой можно было кликать мышкой. Значит, 3D hardware support для десятки не будет.
Прямо из Чикаго (говорят, дождь идет)
пятница, сентября 28, 2007
Имитатция trace во Adobe Flex
Первый тип неудобен для меня, так как он сделан для Mozilla Firefox, а я привык запускать приложения в осле. А второй подразумевает сперва запуск флешки-приемщика сообщений. И еще - мне не нужны всякие навороты типа табличных данных - мне просто нужен вывод текстовых сообщений, ну там массив протрейсить или строчку какую-нибудь вывести. Без обид, ребят:)
Поэтому, я для себя сделал маленький наворот для html-темплейта приложения. Открываем темплейт, добавляем следующий код сразу после body:
<!--logger-->
<input type="button" onclick="toogleVis()" value="show/hide"/>
<input type="button" onclick="clearLog()" value="clear"/>
<div id="log" style="display:block;">
<script language="JavaScript" type="text/javascript">
function setLog(val)
{
var objDiv = document.getElementById("txt_log");
objDiv.scrollTop = objDiv.scrollHeight;
objDiv.value +=val + "\n";
}
function toogleVis()
{
var objDiv = document.getElementById("log");
objDiv.style.display=(objDiv.style.display=="block")?"none":"block";
}
function clearLog()
{
document.getElementById("txt_log").value="";
}
</script>
<textarea style="width:100%; height:150px;" id="txt_log"></textarea>
</div>
<!--logger-->
На body вешаем обработчик onload="clearLog()".
Теперь в нашем флекс-проекте добавим маленькую функцию:
public function strace(val:*):void
{
var str:String = val.toString();
ExternalInterface.call("setLog", str);
}
Теперь после компиляции проекта и открытии его в браузере, наверху появляется текстовое поле, в которое можно выводить свои трейсы:
strace("Hello world :)");
четверг, сентября 27, 2007
Вышла версия 3D движка Sandy для AS3
- совместимость от 7 до 9 версий плеера
- несколько 3D примитивов, позволяющих быстро создавать необходимые объекты без особых трехмерных знаний.
- улучшенное и простое управление объектами, позволяющее без труда их масштабировать, вращать, двигать и т.п.
- улучшенное управление камерой.
- загрузка сложных объектов (.ASE, Collada, 3DS)
- система материалов для управления внешним видом моделей
- использование Flash-фильтров для создания приятных эффектов
Сайт проекта. Вот демки, отсюда можно скачать.
среда, сентября 26, 2007
Тонкости addFrameScript
Вот ее синтаксис:
MovieClip.addFrameScript(frame_number:uint,function_to_call:Function)
Пример:
function myFunction()
{
trace('10th frame')
}
addFrameScript(9, myFunction); // кадры нумеруются с 0
Осталось только научится передавать параметры в эту функцию. Тут нам поможет класс Delegate от Ian Thomas.
package
{
public class Delegate
{
public static function create(handler:Function,...args):Function
{
return function(...innerArgs):void
{
handler.apply(this,innerArgs.concat(args));
}
}
}
}
Теперь мы можем вызывать нашу функцию с параметрами:
package {
import flash.display.*;
public class main extends Sprite {
public function main() {
for (var i:int=0; i<10; i++) {
var mc:MovieClip = new Quad() as MovieClip;
addChild(mc);
mc.addFrameScript(mc.totalFrames-1,Delegate.create(myFunction,i));
}
}
private function myFunction(i:int):void {
trace(i);
}
}
}
Оригинал
Кстати, Денис Коляко недавно ниписал класс ClipFactory.
Класс ClipFactory позволит вам создавать обычный мувиклип с указанным количеством пустых кадров, который вы в последствии сможете использовать в качестве анимационного клипа, выполняя действия в каждом кадре (навесив обработчики через метод addFrameScript).
четверг, сентября 20, 2007
HTML во Flex - теперь еще проще!
FunFX - фреймворк на Ruby для тестирования Flex приложений
FunFX - это бесплатный, опенсорсный фреймворк, разрабатываемый Peter Motzfeldt и позволяющий использовать Flex automation framework с помощью Ruby-скриптов. Сейчас он на ранней стадии разработки, но как видно из видеоурока, он уже много чего умеет. Загрузить можно отсюда.
Оригинал
вторник, сентября 11, 2007
Новый микросайт Audi
А вы еще удивляетесь, почему так быстро Джону Грдену на макбук собрали.
Как добраться до мувиклипов вашей 9 флешки из флекс-приложения
function getMC():MovieClip
{
return mc; // mc - instance name
}
Далее, по идее, мы загружаем это творение через SWFLoader (например, swf_loader) и на событии complete вешаем обработчик со следующим кодом:
var swf_stage:MovieClip = MovieClip(swf_loader.content);
var mc:MovieClip= MovieClip(swf_stage.getMC());
Теперь мы можем использовать этот мувиклип нужным образом.
понедельник, сентября 03, 2007
Блог об интеграции Papervision3D и Flex
- позволить флекс-программистам использовать MXML для построения сцен.
- использовать стиль программирования флекс-эффектов для создания анимации.
- добавлять 3d события для управления inline ActionScript кодом.
- создать DisplayObject3D-обертку для внедрения 2D flex UI компонентов в 3D сцену.
- обеспечить встроенные режимы 3d навигации?!
Есть примерчик с кодом.
В общем, начало интересное. Буду следить.
четверг, августа 30, 2007
Полезные статьи и переводы на Garbage Collector
вторник, августа 28, 2007
Degrafa - Declarative Graphics Framework
"Degrafa is a project dedicated to the development of a Declarative Graphics Framework for Flex 2."
Вот примерчики для затравочки.
среда, августа 22, 2007
Проблемы загрузки SWF 9 во Flex 2 приложения
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Main$iinit()
, где Main - document class флешки, то необходимо проверить нет ли ссылок на stage в этом или других классах флешки. Если таковые есть (например, идет ссылка на размеры сцены), то придется их каким-то образом заменить (например, на жесткие значения) или убрать вообще.
вторник, августа 07, 2007
Проект TileUI - Microsoft Surface в браузере
Хотите попробовать его в действии? Пожалуйста! Дуг Маккун начал проект TileUI, в котором он разрабатывает десктоп на принципах, показанных в демках Surface.
Это плоды его трудов за 12 дней.
среда, августа 01, 2007
Для кругозора - WPF
Как читать Flex Cookbook из Eclipse?
Устанавливается стандартно через Software Updates. Адрес - http://flex.actionscript.it/plugins/Rss_Readers/. В комплекте идет еще и Css Advisor.
вторник, июля 31, 2007
Как можно использовать свойство data у кнопок
Делаем кнопки в цикле:
var lb:LinkButton = new LinkButton();
lb.label = dp[i]["name"];
а идентификатор заносим в свойство data:
lb.data = dp[i]["id"];
Теперь эти данные при нажатии на кнопку можно легко выудить через
event.target.data.
понедельник, июля 23, 2007
Использование Flex Component Kit для Flash CS3
Сейчас, с выходом Flash CS3 и Flex Component Kit взаимодействие между флеш-компонентами и флекс-приложением становиться еще удобнее.
Создание Flash CS3 документа
Для начала необходимо создать новый Flash CS3 документ (star_and_ball.fla). Можно порыться в старых исходниках и вытащить оттуда символы шарика и звездочки, можно нарисовать их самому. Самое главное - чтобы они были отдельными символами с точкой регистрации (0;0). Далее создаем новый символ StarAndBall, помещаем туда наши запчасти на отдельные слои и создаем гайдлайн для движения звездочки вокруг шарика.
Создание Flex компонента
После установки кита (установка проста - загрузили и установили .mxp расширение к флешу.) выбираем символ в библиотеке и в меню команд выполняем новую команду "Make Flex Component". Происходит следующее:
1. Устанавливается фреймрейт в 24fps (чтобы соответствовать флексовому умолчанию).
2. Окно вывода показывает, что UIMovieClip был добавлен и StarAndBall готов к экспорту.
Загляните в свойства символа и посмотрите, что там добавилось.
Публикация
Опубликуем документ, задав в настройках не только компиляцию свф, но и swc: star_and_ball.swf и star_and_ball.swc. Сфка нам сейчас не нужна.
Использование Flash компонента во Flex
Создадим новый флекс-проект, зайдем в его Project Properties и добавим в "Add SWC" нащ star_and_ball.swc.
Флекс сейчас верит, что в star_and_ball.swc находится настоящий флексовый компонент StarAndBall. Чтобы его использовать начните печатать:
<Star
Автокомплит вам подскажет - <local:StarAndBall. Закроем тег и запустим приложение. Вы увидите наш шарик и звездочку!
Сейчас вы можете сказать - зачем сей геморрой, если можно использовать простой SWFLoader? Но нам важно другое - то, что флекс нашел наш символ как класс - и это благодаря UIMovieClip!
Объекты
В старом примере мы могли запускать и останавливать анимацию, вызывать методы с помощью LocalConnection. В предпоследнем примере методы, расположенные на таймлайне, можно было вызывать напрямую.
Сейчас мы сможем вызывать методы, которые принадлежат нашему новому классу!
Вернемся в star_and_ball.fla, откроем свойства символа StarAndBall и увидим, что класс называется StarAndBall. Если нажать кнопочку редактирования рядом, будет сообщено, что класс не существует и он будет создан сейчас же. Тоже самое вы можете сделать и руками.
Итак, в класс StarAndBall.as добавляем наши старые методы:
package {
import flash.display.MovieClip;
import mx.flash.UIMovieClip;
public class StarAndBall extends UIMovieClip
{
public function StarAndBall():void
{
}
public function rotateStar( angle:Number ) : void {
star_mc.rotation = angle;
}
public function zoomStar( factor:Number ) : void {
star_mc.scaleX = factor;
star_mc.scaleY = factor;
}
public function stopPlanet() : void
{
stop();
}
public function resumePlanet() : void
{
play();
}
}
}
Очень похоже на флекс-компонент. Заново опубликуем swc.
Назад во флекс
Дадим нашему компоненту имя
star.stopPlanet();
star.rotateStar(value)
и т.д.
Все исходники лежат здесь.
Спасибо Питеру Энту за полезный пост.
пятница, июля 20, 2007
Тестируем производительность на пузырьках
среда, июня 27, 2007
List и дубликаты в датапровайдере
Сделаем маленький пример:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Script>
[Bindable]
public var listData:Array = ["alpha", "beta", "beta", "gamma", "delta"];
</mx:Script>
<mx:List dataProvider="{listData}"/>
</mx:Application>
В данном случае, если навести мышь на второй элемент, который идентичен третьему, то отработает наведение последний. Я думал, что это баг. Отнюдь. Вычитал из Jira, что List не должен иметь одинаковых элементов - все элементы коллекции должны иметь уникальный id, например,
public var listData:Array = [{label:"alpha", data: "01"}, {label:"beta", data: "04"}, {label:"beta", data: "90"}, {label: "gamma", data: "4"}, {label:"delta", data: "8"}];
Класс ImageSnapshot (Flex SDK 3)
mx.graphics.codec.JPEGEncoder
mx.graphics.codec.PNGEncoder
mx.graphics.codec.IImageEncoder
Интерфейс IImageEncoder служит для классов, которые перекодируют объекты BitmapData в ByteArray. Два вышеназванных класса (PNGEncoder и JPEGEncoder) имплементируют этот интерфейс. Если вы захотите написать свой перекодировщик, то он должен имплеменировать этот интерфейс тоже.
mx.graphics.ImageSnapshot
Класс ImageSnapshot облегчает работу с захватом снимков Flex-компонентов. Применений этому множество: создание отражений, или, например, сохранение изображений у пользователя.
Если раньше для получения Base64-строки снимка Flex UI-компонента необходимо было сделать так:
private function getBase64String(component:UIComponent):String) {
var bitmapData:BitmapData = new BitmapData(component.width, component.height, true, 0xffffff);
bitmapData.draw(component);
var bytes:ByteArray = PNGEncoder.encode(bitmapData);
var b64encoder:Base64Encoder = new Base64Encoder();
b64encoder.encodeBytes(bytes);
var b64String:String = b64encoder.flush();
return b64String;
}
То теперь нам поможет класс ImageSnapshot:
captureBitmapData
Этот метод возвращает объект BitmapData, ограниченный 2880 px по ширине и высоте.
captureImage
Этот метод возвращает объект ImageSnapshot. В параметре функции можно передать тип кодировки - PNG или JPEG.
После получения объекта ImageSnapshot мы имеем ByteArray изображения, который потом можно использовать по своему усмотрению.
encodeImageAsBase64
Этот метод получает объект ImageSnapshot и кодирует его в Base 64 строку.
Итак, перепишем наш пример:
private function getBase64String(component:UIComponent):String) {
var snapshot:ImageSnapshot = ImageSnapshot.captureImage(component);
var b64String:String = ImageSnapshot.encodeImageAsBase64(snapshot);
return b64String;
}
или в одну строку:
private function getBase64String(component:UIComponent):String) {
return ImageSnapshot.encodeImageAsBase64(ImageSnapshot.captureImage(component));
}
Обход максимального размера в 2880 px
Для захвата компонентов с большим размером есть метод captureAll, который создает несколько объектов BitmapData и объединяет их в один ByteArray. Но здесь есть ограничение - максимум 256Мб для ByteArray.
Итак, ничего нового, просто все приведено в порядок и собрано в одном месте, что позволяет сэкономить пару-тройку строк кода:)
Различия между Flex SDK 2.01 и 3
пятница, июня 08, 2007
Flex 3 - баги DeepLinking в Firefox
понедельник, июня 04, 2007
Экспорт изображения без помощи сервера
<img src="data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP
C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA
AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J
REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq
ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0
vr4MkhoXe0rZigAAAABJRU5ErkJggg==" alt="Red dot" />
Правда, отображать таким образом можно относительно небольшие изображения, зато появляется возможность создавать live-скриншоты приложения без помощи сервера.
Хороший пример с исходным кодом есть у Дуга МакКуна.
среда, мая 30, 2007
Подсветка ActionScript 3
вторник, мая 29, 2007
Flex 2.0.1 Hotfix 2
- ошибки в работе Flex Builder и Flex debugger под Flash Player 9 (9.0.45.0) в Мозилле.
- добавлена поддержка ASDoc для Linux, исправлены ошибки запуска ASDoc под Mac и Linux.
- Утечки памяти в Accordion и ViewStack
- RTE из ListBase при клике на датагриде, ошибки неправильного горизонтального скролирования датагрида при скрытии/отображении последней колонки.
- Ошибки твинига дерева при отображении скроллбаров и ошибки отображения данных при удалении нода.
- Изменение compc для использования SourceList.
- Атрибут uri для тега
- Пофиксены LineStyle2 и ButtonRecord2.
- unscaledWidth/unscaledHeight теперь public и read/write.
- Нажатие на полосу прокрутки не работает, если она заскинована
- Удален ExcludeClass metadata из AbstractWebService.
Установка стандартная: забэкапить старый SDK и перезаписать на старый новый.
пятница, мая 25, 2007
Класс Tweener
С помощью этого класса и Papervision3d создан прикольный каталог для ITunes.
Вот небольшой пример кода:
Tweener.addTween(UITarget, {x:selectedGoTo.x, y:selectedGoTo.y, z:selectedGoTo.z-bounceAmount+UISpacing, rotationX:0, rotationY:180, rotationZ:0, time:primeTransTime, transition:transEquation});
Прикольно то, что твининг можно задавать в трех измерениях, а также вращать элемент вокруг своих осей.
понедельник, мая 21, 2007
среда, мая 16, 2007
D.eval() - eval() для Flex
import com.riaone.deval.D;
var six:int;
six = D.eval("4 + 2") as int;
six = D.evalToInt("var x=0; for(i=1;i<=3;++i)x+=i;return x");
six = D.evalToInt("a * b", {a:2, b:3});
six = D.evalToInt("f(5)", {f:function(x:int):int{return x+1}});
six = D.evalToInt("xml.@size*2", {xml: });
six = D.evalToInt('xml= ; return xml.@size*2');
Язык, используемый в D.eval() - это Deval. Он поддерживает все AS3 выражения, включая E4X; он имеет доступ к AS3 классам и функциям, но сам их не задает. Типа, новый шаг в разработке Flex-приложений.
Загрузить можно здесь.
APE - Actionscript Physics Engine
пятница, мая 04, 2007
AS3 String Utils
API:
afterFirst
adterLast
beginsWith
beforeFirst
beforeLast
between
block
capitalize
contains
countof
editDistance
endsWith
hasText
isEmpty
isNumeric
padLeft
padRight
properCase
quote
remove
removeExtraWhiteSpace
reverse
reverseWords
similarity
stripTags
swapCase
trim
trimLeft
trimRight
wordCount
truncate
четверг, апреля 26, 2007
Открываем ссылки в новом окне
...
[Bindable] private var str:String = '<a href="event:http://www.ya.ru">www.ya.ru</a>';
...
<mx:Label selectable="true" htmlText="{str}" link="URLUtil.openWindow(event.text)"/>
Теперь все в порядке.
среда, апреля 18, 2007
AS3 карты
SVN
понедельник, апреля 16, 2007
FDT 3.0 beta
понедельник, апреля 02, 2007
HTMLRenderer - больше, чем htmlText!
HTMLRenderer далеко не универсален, но всего функционала и впихнешь, а если и впихнешь, то можно получить какой-нибудь браузер:)
среда, марта 21, 2007
SWFZ - еще один 3D движок
Примеры:
DOOM ?!
Танцующий динозаврик
Использование материалов для модели
воскресенье, марта 18, 2007
Семейство Flex Explorer
Flex Primitive Explorer - создание графических примитивов.
Flex Filter Explorer - создание графических фильтров.
Flex Transitions and Effects Explorer - эффекты и переходы.
четверг, марта 15, 2007
Flex 2.0 Primitive Explorer
Некоторые тонкости использования E4X
1. Устанавливайте resultFormat="e4x" для HTTPService
По умолчанию, resultFormat для <mx:HTTPService> является "object". Но при получении XML данных, "object" - это не то, что вам нужно. Если же задать "e4x", то lastResult будет являтся XML объектом, который можно парсить с помощью E4X выражений.
2. E4X выражения не ссылаются на самый верхний тег XML
Итак, имеем <mx:HTTPService>, названный myService с resultFormat="e4x", возвращающим следующую структуру:
<?xml version="1.0"?>
<people>
<person>mike</person>
<person>sho</person>
<person>nj</person>
</people>
Эти данные содержатся в myService.lastResult (или в event.result.) Как получить XMLList всех элементов <person>?
Часто думают, что E4X выражения составляют от корневого тега <people>:
var personNodes:XMLList = myService.lastResult.people.person;
// неправильно
А правильно так :
var personNodes:XMLList = myService.lastResult.person;
// правильно
3. Используйте for each, а не for
ECMAScript давно имеет структуру for (ключ в коллекции). Но обратите внимание, что при использовании этого выражения переменной цикла является ключ коллекции, а не значение текущего элемента, поэтому в цикле необходимо писать коллекция[ключ] для ображения к его значению.
E4X добавляет следующую структуру (которую можно использовать на любой коллекции): for each (значение в коллекции). Рассмотрим примеры:
for (var key:* in myService.lastResult.person) {
var value:* = myService.lastResult.person[key];
...
}
А теперь for each:
for each (var value:* in myService.lastResult.person)
{... }
4. Используйте for each (child in parent.*), вместо for each (child in parent)
Итак, есть документ :
var mydocument:XML =Теперь необходимо перебрать всех мышей у этого кота.
<root>
<cat>
<mouse />
<mouse />
<mouse />
</cat>
</root>
var cats:XMLList = mydocument.cat; // это только один элемент
var o:Object = ...; for each (var property:* in o) ...Вы думаете, что следующим образом вы делаете тоже самое:
for each (var mouse:XML in cats) ... // неправильно
Увы, E4X отличается. В E4X, "cats" - это коллекция -- список узлов <cat>, а в примере есть только один <cat>.
Поэтому, чтобы перебрать всех мышей необходимо использовать следующую структуру:// перебрать все прямые дочерние элементы
for each (var mouse:XML in cats.*) { ... }
// или перебрать всех прямых потомков, которые являются узлами <mouse>
for each (var mouse:XML in cats.mouse) { ... }
5. E4X специально стирает различия между XML и XMLList
При изучении E4X, вы узнаете, что есть два типа данных: XML и XMLList. Вроде легко, но потом появляются проблемы с неправильной типизацией данных.var mydocument =
<root>
<rabbit name="Brownster Johansson McGee" />
</root>;
// 'mydocument.rabbit' - список всех узлов <rabbit>, значит
// myPetRabbit должен быть XMLList? Но я назвал переменную
// 'myPetRabbit', а не 'myPetRabbits',
// потому что я знаю, что заяц только один.
var myPetRabbit:XMLList = mydocument.rabbit;
// Как же его зовут? Почему следующее выражение не вызывает ошибки,
//ведь myPetRabbit - это XMLList?
trace(myPetRabbit.@name);
Причина в том, что E4X намеренно стирает различия между XML и XMLList. Каждый XMLList, который содержит один элемент, будет рассматриваться как XML. (Если 'myPetRabbit' будет содержать несколько узлов, то myPetRabbit.@name будет возвращать список всех атрибутов "name" все узлов <rabbit>.)
Например, рассмотрим документацию по методу XMLList.toString():
- Если объект XML имеет простую структуру, то метод toString() возвращает содержимое узлов без тегов, атрибутов, пространств имен и т.п.
- Если объект XML имеет сложную структуру, то метод toString() возвращает все содержимое, вклюяая теги, атрибуты и т.п.
То есть если XMLList содержит <node>hello</node>, то toString() вернет "hello"; но если он содержит <node>hello</node><node>goodbye</node>, toString() вернет "<node>hello</node><node>goodbye</node>" (а не "hellogoodbye"). Если же вам всегда нужен полный XML, используйте toXMLString() вместо of toString().
6. Внимание! Простое выражение может вам дорого обойтись
При использовании простых объектов нет ничего удивительного в использовании следующего кода:
var x:Object = ...;
if (x.y.z == 3)
foo(x.y.z);
Код работает быстро, проблем не вознкает.
Но в E4X операция типа "x.y.z" будет означать, что цикл проходит через всю XML-структуру и ищет соответствующие совпадения:
var mydocument:XML = ...;
if (mydocument.cat.mouse.length() == 3)
{foo(mydocument.cat.mouse)};
Итак, если вам потом понадобиться использовать результат, то лучше сохранить его в XMLLis переменнойt:
var mydocument:XML = ...;
var mice:XMLList = mydocument.cat.mouse;
if (mice.length() == 3)
{foo(mice);}
7. Используйте дебаггер
Отладчик поможет вам разобраться в значениях XML и XMLList переменных.
Отсюда
среда, марта 07, 2007
Презентация Papervision
Взял отсюда.
вторник, марта 06, 2007
ActionScript 2.0 - 3.0 Migration Cheatsheet
понедельник, марта 05, 2007
четверг, марта 01, 2007
Easing-эффекты в одном месте
FlexLib на Google Code
суббота, февраля 17, 2007
Примеры движка Papervision3D
Может для заядлых 3D-шников это ерунда, но меня впечатлило!
среда, февраля 14, 2007
Adobe Flex Coding Guidelines
Flex Style Explorer 2.01
1) Навороченный ColorPicker (эх, Василий, не видели они вашего)
2) Экспорт всего CSS
3) Поддержка StyleName
4) Стили форматирования текста
5) Возможность введения значения руками и слайдером
6) Добавлены ToggleButtonBar, HDividedBox, VDividedBox, TextArea, VRule, VSlider, ColorPicker, ToolTip
7) Улучшенная навигация
8) Индикация отредактированных компонентов
9) Работа с прозрачным приложением
10) Улучшение UI
среда, февраля 07, 2007
Прикольный скин - мятые салфетки
четверг, января 25, 2007
Макросы в html-темплейтах флекс-проекта
Название проекта, MyProject.
${application}
Имя приложения, MyApp.
${version_major}
Major-версия плеера, т.е. 9 для 9.0 r28.
${version_minor}
Minor-версия, т.е. 0 для 9.0 r28.
${version_revision}
revision-версия, т.е. 28 для 9.0 r28.
${build_suffix}
Суффикс, определяющий тип версии приложения, "-debug" - для отладочной версии и "" - для релиза.
${swf}
Имя SWF файла без расширения .swf. Эквивалентно ${application}${build_suffix}.
${bgcolor}
Фон приложения, заданный в атрибуте backgroundColor тега <mx:Application> или в поле метаданных backgroundColor в [SWF] metadata атрибуте [SWF(backgroundColor="#ffffff")] public class MyApp extends Sprite.
${width} и ${height}
Ширина и высота приложения, заданная в <mx:Application> или в метаданных [SWF(width="300", height="400")] public class MyApp extends Sprite.
${title}
заголовок приложения, заданный в атрибуте pageTitle тега <mx:Application> или в [SWF(pageTitle="flex r00lz")] public class MyApp extends Sprite.
Отсюда
среда, января 24, 2007
Flex2LocalDebugger - трейс-панель во флексе
LocalDebugger.show('test'); вылетает окошко Alert с надписью test.
А LocalDebugger.trace('test'); заносит информацию в окно отладки. Flex2LocalDebugger работает через LocalConnection, поэтому для правильной работы функции trace необходимо запустить файлик Flex2LocalDebuggerConsole.html, который идет в архиве. В нем и будут отображаться все ваши трейсы.
PageFlip во флеше и флексе
среда, января 17, 2007
felxoBooth - сервис для эксбиционистов
пятница, января 12, 2007
Альтернатива FMS - Wowza Media Server
О цене WMS будет объявлено позже.
четверг, января 11, 2007
Несколько заметок про Date
Например, если задать в качестве месяца -1, то из даты будет вычтен месяц:
var dt:Date = new Date( 2006, -1, 1 );
// Thu Dec 1 00:00:00 GMT+0300 2005
Теперь попытаемся создать 0 января 2006 года:
dt = new Date( 2006, 0, 0 );
Получим 31 декабря 2005 года.
0 марта не существует, поэтому получаем 29 февраля (2008 год будет високосным):
dt = new Date( 2008, 2, 0 );
Теперь вычтем из текущей даты неделю:
dt = new Date();
dt.date = dt.date - 7;
Получим Thu Jan 4 2006.
Вот такая математика:)
С прошедшими праздниками всех!