Adobe AIR 1.1 出了,HTML Input Text 终于支持双位元文字输入法了
Download Adobe AIR SDK
Adobe AIR extension for Dreamweaver CS3
Installing Adobe Air 1.1 Update for Flash CS3 Professional
Read more...
Flash、Flex、ActionScript 相关研究心得
Adobe AIR 1.1 出了,HTML Input Text 终于支持双位元文字输入法了
Download Adobe AIR SDK
Adobe AIR extension for Dreamweaver CS3
Installing Adobe Air 1.1 Update for Flash CS3 Professional
Read more...
张贴者: {id: "Ticore"}; // 位于 6/17/2008 12:40:00 下午 0 意见 此文章的连结
拜 Adobe AIR ActionScript, JavaScript 混搭功能所赐
ActionScript 3.0 runtime 可以使用 JavaScript 创建的 Function
也能互相应用 Scope
由于 ActionScript 是编译语言,无法动态创建 Statement, Function
但是 JavaScript 可以
于是想到结合 AIR, JavaScript 动态的功能
让 ActionScript 3.0 也能具有直译程序的能力
以下创建 AS3 对象,动态赋予两个 JS Function 成员:
// Ticore's Blog - http://ticore.blogspot.com/
import flash.utils.*;
import flash.system.*;
var htmlLdr:HTMLLoader = new HTMLLoader();
var jsRuntime:Object = htmlLdr.window;
var obj:Object = {};
obj.name = "Object 1";
obj.getName = new jsRuntime.Function(null, "return this.name;");
obj.setName = new jsRuntime.Function("value", "this.name = value;");
trace(obj.getName()); // Object 1
obj.setName("Object 2");
trace(obj.getName()); // Object 2
相关连结:
AIR - 如何区分 JavaScript 与 ActionScript 对象
Adobe AIR Namespace Bug
AIR - JavaScript 与 ActionScript 之间对象的传递
张贴者: {id: "Ticore"}; // 位于 5/18/2008 09:24:00 上午 0 意见 此文章的连结
标签: ActionScript, Adobe-AIR, AS3, JavaScript, Mashup, Trick
Adobe AIR 虽然可以让 ActionScript 与 JavaScript 对象互相传递调用
但是除了基础对象以外,复杂对象是不会被转换的
某些情况下,仍需要注意所持有的对象到底是 AS Object 还是 JS Object
以下介绍如何区分 JavaScript 与 ActionScript 对象
于 AIR ActionScript runtime 中辨别对象是否为 AS Object
import flash.html.*;
import flash.events.*;
import flash.utils.*;
import flash.system.*;
var htmlLdr:HTMLLoader = new HTMLLoader();
var jsRuntime:Object = htmlLdr.window;
var asObj:Object = new Object();
var asAry:* = new Array();
var asDate:* = new Date();
var asSprite:* = new flash.display.Sprite();
var asXML:* = new XML();
var asXMLList:* = new XMLList();
var asRegExp:* = new RegExp();
var asNS:* = new Namespace();
var asFun:* = function():void{};
var asNo:* = new Number();
var asStr:* = new String();
var asBol:* = new Boolean();
var jsObj:Object = new jsRuntime.Object();
var jsAry:Object = new jsRuntime.Array();
var jsDate:Object = new jsRuntime.Date();
var jsFun:Object = new jsRuntime.Function("", "");
var jsNo:Object = new jsRuntime.Number();
var jsStr:Object = new jsRuntime.String();
var jsBol:Object = new jsRuntime.Boolean();
function isASObject(o:*):Boolean{
//return o.constructor is Class;
return getQualifiedClassName(o).indexOf("flash.html::__HTMLScript") < 0;
}
trace(isASObject(asObj)); // true
trace(isASObject(asAry)); // true
trace(isASObject(asDate)); // true
trace(isASObject(asSprite)); // true
trace(isASObject(asXML)); // true
trace(isASObject(asXMLList)); // true
trace(isASObject(asRegExp)); // true
trace(isASObject(asNS)); // true
trace(isASObject(asFun)); // true
trace(isASObject(asNo)); // true
trace(isASObject(asStr)); // true
trace(isASObject(asBol)); // true
trace(isASObject(jsObj)); // false
trace(isASObject(jsAry)); // false
trace(isASObject(jsDate)); // false
trace(isASObject(jsFun)); // false
trace(isASObject(jsNo)); // true
trace(isASObject(jsStr)); // true
trace(isASObject(jsBol)); // true
// Ticore's Blog - http://ticore.blogspot.com/
于 AIR JavaScript runtime 中辨别对象是否为 JS Object
var asObj = new runtime.Object();
var asAry = new runtime.Array();
var asDate = new runtime.Date();
var asSprite = new runtime.flash.display.Sprite();
var asXML = new runtime.XML();
var asXMLList = new runtime.XMLList();
var asRegExp = new runtime.RegExp();
var asFun = runtime.trace;
var asNo = new runtime.Number();
var asStr = new runtime.String();
var asBol = new runtime.Boolean();
var jsObj = new Object();
var jsAry = new Array();
var jsDate = new Date();
var jsFun = function(){};
var jsNo = 10;
var jsStr = "str";
var jsBol = true;
function isJSObject(o) {
return o.constructor instanceof Function;
}
runtime.trace(isJSObject(asObj)); // false
runtime.trace(isJSObject(asAry)); // false
runtime.trace(isJSObject(asDate)); // false
runtime.trace(isJSObject(asSprite)); // false
runtime.trace(isJSObject(asXML)); // false
runtime.trace(isJSObject(asXMLList)); // false
runtime.trace(isJSObject(asRegExp)); // false
runtime.trace(isJSObject(asFun)); // false
runtime.trace(isJSObject(asStr)); // true
runtime.trace(isJSObject(asNo)); // true
runtime.trace(isJSObject(asBol)); // true
runtime.trace(isJSObject(jsObj)); // true
runtime.trace(isJSObject(jsAry)); // true
runtime.trace(isJSObject(jsDate)); // true
runtime.trace(isJSObject(jsFun)); // true
runtime.trace(isJSObject(jsStr)); // true
runtime.trace(isJSObject(jsNo)); // true
runtime.trace(isJSObject(jsBol)); // true
// Ticore's Blog - http://ticore.blogspot.com/
以上的方式,除了 Number, String, Boolean 会自动转换的对象以外
应该都可以辨别大部分的 AS or JS Object
其实之前尝试过各种不同的方式
像是 __proto__, constructor is Class 等等
但是都无法用在所有的对象判别上
相关连结:
AIR - ActionScript, JavaScript 混搭技巧
Adobe AIR Namespace Bug
AIR - JavaScript 与 ActionScript 之间对象的传递
张贴者: {id: "Ticore"}; // 位于 5/17/2008 11:54:00 上午 0 意见 此文章的连结
标签: ActionScript, Adobe-AIR, AS3, Flash, JavaScript, Mashup, Object-Comparison, Trick
继续之前的 Adobe AIR AS-JS runtime 混合测试
发现无法从 JavaScript runtime 创建 AS3 Namespace 实体
AIR JavaScript 测试程序如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript">
new runtime.Namespace();
// Error: Internal Error
new runtime.Namespace("ns", "http://ticore.blogspot.com");
// Error: Internal Error
</script>
</head>
<body>
</body>
</html>
只要尝试创建 Namespace 就会出现 Error
于是转个弯,从 AS3 runtime 创建 Namespace 丢给 JavaScript runtime
AIR ActionScript 3.0 测试程序如下:
package {
import flash.display.*;
import flash.html.*;
import flash.system.*;
import flash.desktop.*;
public class Main extends MovieClip {
public var htmlLdr:HTMLLoader = new HTMLLoader();
public function Main() {
var nativeApp:NativeApplication = NativeApplication.nativeApplication;
trace("AIR version :", nativeApp.runtimeVersion, nativeApp.runtimePatchLevel);
// AIR version : 1.0.1 4990
trace("Flash Player version :", Capabilities.version);
// Flash Player version : WIN 9,0,124,0
trace("Flash Player type :", Capabilities.playerType);
// Flash Player type : Desktop
// Create javascript function
var jsFun:* = new htmlLdr.window.Function(["obj"], "return obj;");
try {
trace(jsFun(new htmlLdr.window.Object()));
// [object Object]
trace(jsFun(new Object()));
// [object Object]
trace(jsFun(new Namespace("ns", "http://ticore.blogspot.com")));
// AIR runtime crash !
} catch (e:Error) {
trace(e);
}
}
}
}
结果更糟糕,Adobe AIR 直接 Crash!
OS:Windows VISTA SP1
以上 Bug 至少会发生在以下版本的 Adobe AIR
Adobe AIR 1.0 4880
Adobe AIR 1.0.1 4990
相关连结:
AIR - ActionScript, JavaScript 混搭技巧
AIR - 如何区分 JavaScript 与 ActionScript 对象
AIR - JavaScript 与 ActionScript 之间对象的传递
张贴者: {id: "Ticore"}; // 位于 5/13/2008 07:08:00 下午 0 意见 此文章的连结
标签: ActionScript, Adobe-AIR, AS3, Bug, JavaScript, Mashup, Namespace
自从 Flash Player 进入到 9 版之后,功能越来越复杂
每一次的 release 都有相当程度变动
遇到版本更新有关的问题时,只知道自己装的 Flash Player 是 9 版
却不知道是哪一个 build or release
问题就很难解决了~
Adobe AIR 也是一样的
以下便是取得 AIR runtime 与 Flash Player 完整版本的方式
// AS3 Get Adobe AIR runtime version import flash.desktop.*; var nativeApp:NativeApplication = NativeApplication.nativeApplication; trace(nativeApp.runtimeVersion); // 1.0 trace(nativeApp.runtimePatchLevel); // 4880 // AS3 Get Flash Player version trace(flash.system.Capabilities.version); // WIN 9,0,115,0 // AS2 Get Flash Player version trace(System.capabilities.version); // WIN 9,0,115,0 // AS1 Get Flash Player version trace($version); // WIN 9,0,115,0 // AS3 Get Operating System trace(flash.system.Capabilities.os); // Windows XP // AS2 Get Operating System trace(System.capabilities.os); // Windows XP // AS3 Get Flash Player type trace(flash.system.Capabilities.playerType); // External // AS2 Get Flash Player type trace(System.capabilities.playerType); // ExternalRead more...
张贴者: {id: "Ticore"}; // 位于 5/13/2008 12:19:00 上午 0 意见 此文章的连结
标签: ActionScript, Adobe-AIR, AS1, AS2, AS3, Flash-Player, Mashup, Trick
Adobe AIR 运行环境下,集成了 ActionScript 3.0 与 JavaScript
可以在 ActionScript runtime 下,调用 JavaScript function;反之亦然
在 AIR HTML App 下,许多延伸功能,像是 SQLite, File System....
JavaScript 也都是透过调用 ActionScript 达到的
而 JavaScript 甚至可以直接透过 Script 标签引用外部 AS Library
但是,AIR AS-JS 真的集成那么好吗?
以下先就对象在 AS 与 JS runtime 之间传递与转型测试
分别在 AIR AS, JS 运行环境下生成 AS, JS 常用对象实体
测试对象的型别
AIR ActionScript 3.0 测试程序:
import flash.html.*;
var htmlLdr:HTMLLoader = new HTMLLoader();
var jsRuntime:Object = htmlLdr.window;
function traceType(obj) {
trace(flash.utils.getQualifiedClassName(obj));
}
traceType(new jsRuntime.Object()); // flash.html::__HTMLScriptObject
traceType(new jsRuntime.Array()); // flash.html::__HTMLScriptArray
traceType(new jsRuntime.Date()); // flash.html::__HTMLScriptObject
traceType(new jsRuntime.Function()); // flash.html::__HTMLScriptFunction
traceType(new jsRuntime.RegExp()); // flash.html::__HTMLScriptObject
traceType(new jsRuntime.String()); // String
traceType(new jsRuntime.Number()); // int
traceType(new jsRuntime.Boolean()); // Boolean
traceType(new Object()); // Object
traceType(new Array()); // Array
traceType(new Date()); // Date
traceType(new Function()); // Function-35
traceType(new RegExp()); // RegExp
traceType(new String()); // String
traceType(new Number()); // int
traceType(new int()); // int
traceType(new uint()); // int
traceType(new Boolean()); // Boolean
traceType(1.1); // Number
traceType(true); // Boolean
traceType("str"); // String
AIR JavaScript 测试程序:
function traceType(obj) {
runtime.trace(runtime.flash.utils.getQualifiedClassName(obj));
}
traceType(new Object()); // flash.html::__HTMLScriptObject
traceType(new Array()); // flash.html::__HTMLScriptArray
traceType(new Date()); // flash.html::__HTMLScriptObject
traceType(new Function()); // flash.html::__HTMLScriptFunction
traceType(new RegExp()); // flash.html::__HTMLScriptObject
traceType(new String()); // String
traceType(new Number()); // int
traceType(new Boolean()); // Boolean
traceType(new runtime.Object()); // Array
traceType(new runtime.Array()); // Array
traceType(new runtime.Date()); // Date
traceType(new runtime.Function()); // Function-35
traceType(new runtime.RegExp()); // RegExp
traceType(new runtime.String()); // Boolean
traceType(new runtime.Number()); // int
traceType(new runtime.int()); // int
traceType(new runtime.uint()); // int
traceType(new runtime.Boolean()); // Boolean
traceType(1.1); // Number
traceType(true); // Boolean
traceType("str"); // String
从测试结果看起来,似乎只有 Number, Boolean, String 可能是共用的型别
或者是在 AS-JS 传递时,被自动转换了
至于其它复杂型别的对象,可能是被包覆为 Proxy 对象
假如真的是如此,复杂对象在 AS-JS 传递时必须要额外注意了
可能会发现到以上的测试都只有使用 AS3 getQualifiedClassName 观察型别
没有用到 JS typeof 测试
原因是 typeof 功能实在太阳春而且诡异,无法用来测试
参考 诡异的 JavaScript typeof 函式
相关连结:
AIR - ActionScript, JavaScript 混搭技巧
AIR - 如何区分 JavaScript 与 ActionScript 对象
Adobe AIR Namespace Bug
张贴者: {id: "Ticore"}; // 位于 5/11/2008 03:26:00 下午 0 意见 此文章的连结
标签: ActionScript, Adobe-AIR, AS3, JavaScript, Mashup
Bug 又来了,以下任一行 AS3 程序都会造成 Flash Player Crash
Object['isPrototypeOf'](); Object['hasOwnProperty'](); Object['propertyIsEnumerable'](); Object['setPropertyIsEnumerable']();
实在是太诡异了,这么平常的 Class - Object
居然可以轻易让 Flash Player 挂掉
其实该 Bug 是在测试 Adobe AIR JavaScript 时发现的
连带的导致 AIR 也 Crash
因为 JavaScript 没有型别检查功能
不小心就会调用到不属于该对象的方法
平常 Flash 多亏了 AS3 型别检查
才会让该问题这么久没有浮上台面
正常情况下,对 Class 调用 non-static member 虽然是错误的动作
但是也不至于会造成 Flash Player Crash
只要捕捉例外就好
但是对于以上这四行 AS3 程序
try...catch 例外捕捉完全没用,Flash Player 照样 Crash
以上 Bug 至少会在以下的 Flash Player 版本发生
Flash Player 9.0.47.0
Flash Player 9.0.115.0
Flash Player 9.0.124.0
相关连结:
一行 AS3 程序让 Flash Player 9 死机 Part 3
一行 AS3 程序让 Flash Player 9 死机 Part 2
一行 AS3 程序让 Flash Player 9 死机
用 @* 指定 Attributes 造成 Flash Player 9 Crash
张贴者: {id: "Ticore"}; // 位于 5/04/2008 11:00:00 下午 0 意见 此文章的连结
标签: ActionScript, Adobe-AIR, AS3, Bug, Flash, Flash-Player
Flash Player 9 update 3 (9.0.115.0) 添加了 flash.sampler package
里面的类别与方法主要都是与内存使用有关的
可以在 Flash Player 9 update 3 debug version 与 Adobe AIR 环境中使用
以下简单利用 flash.sampler.getSize 函式观察常用对象所占内存的大小
ActionScript 3.0 Code:
import flash.sampler.*;
import flash.display.*;
trace("new Number() : ", getSize(new Number()));
trace("new int() : ", getSize(new int()));
trace("new uint() : ", getSize(new uint()));
trace("new Boolean() : ", getSize(new Boolean()));
trace("new Object() : ", getSize(new Object()));
trace("new Array() : ", getSize(new Array()));
trace("new String() : ", getSize(new String()));
trace("new Date() : ", getSize(new Date()));
trace("new XML() : ", getSize(new XML()));
trace("new XMLList() : ", getSize(new XMLList()));
trace("new RegExp() : ", getSize(new RegExp()));
trace("new Function() : ", getSize(new Function()));
trace("new Sprite() : ", getSize(new Sprite()));
trace("new MovieClip() : ", getSize(new MovieClip()));
trace("Number : ", getSize(Number));
trace("int : ", getSize(int));
trace("uint : ", getSize(uint));
trace("Boolean : ", getSize(Boolean));
trace("Object : ", getSize(Object));
trace("Array : ", getSize(Array));
trace("String : ", getSize(String));
trace("Date : ", getSize(Date));
trace("XML : ", getSize(XML));
trace("XMLList : ", getSize(XMLList));
trace("RegExp : ", getSize(RegExp));
trace("Function : ", getSize(Function));
trace("Sprite : ", getSize(Sprite));
trace("MovieClip : ", getSize(MovieClip));
trace("[] : ", getSize([]));
trace("[0] : ", getSize([0]));
trace("[0, 1] : ", getSize([0, 1]));
trace("[null, null] : ", getSize([null, null]));
trace("new Array(0) : ", getSize(new Array(0)));
trace("new Array(1) : ", getSize(new Array(1)));
trace("{} : ", getSize({}));
trace("{a: 'a'} : ", getSize({a: 'a'}));
trace("{a: 'ab'} : ", getSize({a: 'ab'}));
trace("{a: {}} : ", getSize({a: {}}));
trace("{a: 'a', b: 1} : ", getSize({a: 'a', b: 1}));
trace("{a: null, b: null} : ", getSize({a: null, b: null}));
trace("1 : ", getSize(1));
trace("1.1 : ", getSize(1.1));
trace("'A' : ", getSize('A'));
trace("'AB' : ", getSize('AB'));
trace("'ABC' : ", getSize('ABC'));
function fun1():void{};
function fun2(arg1:*):void{var a:* = 1;};
trace("fun1 : ", getSize(fun1));
trace("fun2 : ", getSize(fun2));
输出结果:
new Number() : 4
new int() : 4
new uint() : 4
new Boolean() : 4
new Object() : 24
new Array() : 40
new String() : 28
new Date() : 32
new XML() : 16
new XMLList() : 32
new RegExp() : 48
new Function() : 588
new Sprite() : 464
new MovieClip() : 496
Number : 1133
int : 856
uint : 856
Boolean : 452
Object : 3282
Array : 4204
String : 3319
Date : 8235
XML : 4818
XMLList : 3118
RegExp : 1008
Function : 977
Sprite : 1602
MovieClip : 2182
[] : 40
[0] : 44
[0, 1] : 48
[null, null] : 48
new Array(0) : 40
new Array(1) : 40
{} : 24
{a: 'a'} : 32
{a: 'ab'} : 32
{a: {}} : 32
{a: 'a', b: 1} : 40
{a: null, b: null} : 40
1 : 4
1.1 : 8
'A' : 30
'AB' : 32
'ABC' : 34
fun1 : 32
fun2 : 32
Read more...
张贴者: {id: "Ticore"}; // 位于 5/01/2008 09:59:00 下午 0 意见 此文章的连结
标签: ActionScript, Adobe-AIR, AS3, Debug, Flash-Player, GC, Trick
Adobe AIR 很早就说要跨平台支持三种 OS
可是到现在已经 Beta 3 了,Linux 版本完全没有消息
结果 Zinc 3.0 已经率先推出 Linux 版本
从资料上看,Zinc 3.0 支持功能比 AIR 多太多了
SQLite、MySQL、MSAccess、ADO 四种数据库
RealMedia、QuickTime、MediaPlayer、PDF、Browser 混搭
Dll 扩充、Process、FileSystem
其它还有一堆....
可是这么多的功能,主要都是在 Windows 上才有
换到的 Mac OS X 马上缩水一半
再换到 Linux 上就已经所剩无几了
Adobe AIR 支持的功能虽然不多
可是当前在 Windows 与 Mac OS 上来看,是非常一致的
而且这些功能与 Flash Player 集成程度很高
Flashmagazine - AIR is not a projector
Multidmedia Zinc 3.0 and Adobe AIR in review
张贴者: {id: "Ticore"}; // 位于 2/05/2008 03:49:00 下午 2 意见 此文章的连结
标签: Adobe-AIR, Flash-Player, Mashup, NEWS, SWF, Technology
Apollo Alpha 1 终于出来了
这大概是最令人振奋的消息吧
初步简单的测试
觉得不好的地方有
以下则是一些觉得不错的功能
感受上,Apollo 似乎还是以 Flash Base App. 为主
Apollo 内的 WebKit 还有许多地方需要改善
这让我想到之前 Adobe 捐赠 Mozilla AVM2 的事情
也许采用 Fx 的核心会好得多~~~
Apollo 主要是提供 Flash、HTML、PDF 混搭运行环境
而 Artemis 则是扩充 Apollo 提供 Java Runtime Bridge 能力
当前还没有任何东西释出
非常值得关注~
(现在进入希腊神话时代了吗?)
张贴者: {id: "Ticore"}; // 位于 3/21/2007 10:50:00 上午 0 意见 此文章的连结
标签: Adobe-AIR, Mashup, NEWS, Technology