Create Fireworks in Flash

July 2nd, 2009

This article was submitted by Enric Godes, project manager at Vasava, a design studio. Godes and Vasava were commissioned by Adobe Software to create this tutorial.
Today we’re going to develop a virtual fireworks display in Flash.

To follow along, you’ll need:

  • Also, you can grab the finished project to check your work (SWF download)

How to Proceed

Step 1: Change the Flash movie to 800×600 and 65 fps.

Flashfireworks1.jpg
Step 2: Draw a 4 px circle and transform it on symbol by pushing F8.

Step 3: Edit the MovieClip and animate it from left to right on a straight line. These are the sparks eminating from the center of the individual fireworks.

We used a shape interpolation for this. Later, you can also try varying animation types and change the timing to create different results. Insert a stop on the last frame.

Flashfireworks3.jpg
Step 4: Find the MovieClip on the library and right click to open the properties window on the class field and change it to “Particle”
Flashfireworks4.jpg

Step 5: Make a new symbol and put it on the scene. On the properties window, change it to “nightSky.” This is where we will put the fireworks.

Step 6: And now the coding. First, import the classes we are going to use

import caurina.transitions.Tweener;
import flash.events.*;

Step 7: Next, define the movie vars.

var fwParticlesCount:uint=200; // particles in each explosion
var fwTimer:uint=2000; // time between explosions
var timer:Timer = new Timer(fwTimer);
// this adds a timer, in each step of the timer it will call fire() function
timer.addEventListener(TimerEvent.TIMER, fire);
timer.start();

Step 8: We want to use a lot of random numbers, so we created the following function to save some time.

function randRange(min:Number, max:Number):Number {
    var randomNum:Number = Math.random() * (max - min + 1) + min;
    return randomNum;}

Step 9: And now the main function, which is putting the particles in a circle, animating them and setting their opacity and position.

function fire(event:TimerEvent){

	// the origin coordinate for the firework
    var x0:uint=randRange(100,700);
    var y0:uint=randRange(100,500);

    // now i'm going to create and define the properties of each particle in the firework

    for(var i:uint=0;i<fwParticlesCount;i++){
           var tempParticle:Particle=new Particle();
           tempParticle.x=x0;
           tempParticle.y=y0;
           tempParticle.rotation=randRange(0,360)

           tempParticle.scaleX=tempParticle.scaleY=randRange(.3,1)

           //add to the stage
           nightSky.addChild(tempParticle)

           //the particle is going to start with the animation you prepared on the Movie Clip
           //then with a little delay the Tweener animates the y an opacity,
           //onComplete remove the mc from stage and deletes the particle
    Tweener.addTween(tempParticle,{y:y0+200+randRange(-50,50),alpha:0,delay:1,time:2,transition:"easeInSine",onComplete:function(){nightSky.removeChild(this);delete this}});
        }
}

Flashfireworks6.jpg
That’s all you need to do. Now just sit back and enjoy the show!
Enric Godes is a project manager at Vasava. Started in Barcelona in 1997, Vasava is a communication studio with 18 young designers who specialize in cross-media projects: print, web, motion, 3D animation, and video. To unleash creativity and meet the deadline-driven demands of clients, Vasava relies on the integrated, cross-discipline tools found in Adobe Creative Suite Master Collection software.

Adobe Flash正式登录新款HTC Android手机Hero

June 24th, 2009

本周三Adobe公司宣布HTC新款Android手机Hero将内建Adobe Flash播放器。这款手机今年7月份将在欧洲地区首发,并于今年晚些时候在亚洲和北美地区上市。这次合作意味着Adobe在手机市场推广Flash的行 动取得了又一项重要成果。不过,这次内建的Flash播放器并不是基于最新版ActionScript 3的Flash Player10版本,而是基于ActionScript 2的较老版Flash Player9,不过Adobe宣称未来一段时间内HTC会向手机用户提供升级版的Flash Player10。

Adobe 的声明称:移动版Flash Player 10将在明年上半年推出,而这个版本的Beta版则会在今年第四季度推出。另外,Flash播放器会被直接内建在Hero手机中,并不会提供网络下载,这 样其它Android手机的用户就无法将其下载到自己的手机上使用。

Flash如今已经成为网页上最常见的元素,许多视频,游戏和页面元素都是采用Flash来构建的,同时Flash还可以用于制作广告条。

本周三Adobe在一段线上视频中演示了Flash在Android手机上的表现,这段视频演示了手机使用Flash观看雅虎电影片段,玩Flash小游戏等的过程,双击Flash元素就可以将Flash画面放大至全屏模式。

不过,尽管Adobe非常想在iPhone平台上推广Flash,并且已经在为苹果开发专用的Flash播放器版本,但iPhone目前为止仍然与Flash绝缘。

我们正在为iPhone手机开发Flash播放器,不过要在这个平台上发布我们的播放器首先需要经过苹果的同意,在这方面我们还有很多工作要做。 Adobe首席技术官Kevin Lynch在去年的一次访谈中说:我们希望iPhone手机也能运行我们的Flash软件。(cnBeta)

Adobe宣称Flash10移动版十月份推出:iPhone依然无福消受

June 23rd, 2009

尽管苹果的iPhone系列手机最近在市场上风头甚劲,而且他们最近又推出了新款的iPhone3GS手机。不过这些苹果手机都存在一个通病,那就是普遍缺乏对Adobe Flash视频的支持,从iPhone手机上市起,人们就在为此抱怨,而直到现在情况依然没有变化。

Adobe公司的CEO Shantanu Naraye最近在一次会议上宣布Adobe Flash的下一个版本将是Flash 10beta版,并将于今年十月份早期推出,该版本将支持大多数智能手机系统,包括Android, webOS, Windows Mobile和塞班,不过这里我们依然没有看到iPhone的影子。

这则消息对使用谷歌Android或webOS操作系统的手机来说可谓意义重大,目前为止,在这两款操作系统中一直没有好用的Flash视频播放器。不过,在基于塞班和Windows mobile的系统中则已经实现了对Flash视频的支持。

按照Adobe的说法,为了更好地支持自己的新版Flash软件,包括ARM,Nvidia,Broadcom,高通,Intel以及德州仪器在内的多家处理器厂商都在为产品进行优化。

不过,按照我们上周的报道,未来一段时间内新的HTML5有可能会取代Adobe Flash的位置,此前谷歌已经展示了可以运行在HTML5环境下的Youtube新版本。HTML5标准是由谷歌和苹果共同发起,而这可能就是 iPhone一直不愿意使用Flash的主要原因之一。(cnBeta)

galileo(Eclipse 3.5)正式版(GA)已经可以bt下载

June 23rd, 2009

眼看着Eclipse的首页一天天变化,从”两周”到“一周”到“六天”,…………“两天”、“一天”,终于,万众瞩目的代号“Galileo”的Eclipse 3.5 GA(General Availability )将于北京时间2009年6月25日10:00(ET时间2009年6月24日9:00AM)准时发布,犹豫什么,下吧^_^,本次发布的其他信息,请访问发布日程表

性急的朋友已经可以bt下载了!地址为:

http://www.eclipse.org/downloads/ ,点击Galileo Early Access ,即可选择自己想要的Package种子
如下图:


稍后可以从Eclipse官方网站或镜像直接下载:

下载地址:

http://www.eclipse.org/downloads/packages/release/galileo/

对应的Eclipse SDK 3.5正式版下载地址:

http://download.eclipse.org/eclipse/downloads/index.php

对应的语言包(Eclipse Babel Project)下载:

http://www.eclipse.org/babel/downloads.php

或直接http://download.eclipse.org/technology/babel/babel_language_packs/galileo.php

这一新版的Java开发环境包括了不少新特性并对以前版本做出了改进。

新特性包括:

平台及UI

  • Solaris x86已经加入支持行列
  • Install New Software向导中的“Work with:”下拉框现在支持自动补全
  • 增加了一个新的介绍主题,叫做“Slate”
  • 打开的编辑器及多编辑器页面间的切换更加容易(快捷键:Ctrl+PageDown/Ctrl+PageUp,Alt+PageDown/Alt+PageUp)
  • 为了快速关闭,现在可以安全地跳过清楚历史这一步骤
  • 至于编辑器的常规提示框和对话框,或当前工作台窗口、表单现在可以在Mac Cocoa上使用
  • 应用程序在打印过程中或打开打印对话框时,可以选择portrait或landscape模式
  • Eclipse富客户端平台现在包含了一个OSGi声明式服务(Declarative Services——DS)的实现
  • 你现在可以针对给定选项“钉住”属性视图
  • 一个新偏好页,可以管理用于选择工作区的启动提示框
  • About对话框现在提供一种机制,让plug-in可以给平台about对话框提供安装页面
  • Install New Software向导现在无需等待连接任何更新服务器就可以立即打开
  • 双击垂直折叠线(vertical folding line)可以折起折叠区域
  • 比较编辑器有几处增强
  • 你现在可以在Debug视图中快速切换挂起线程
  • 支持Cocoa和Cocoa上的OpenGL
  • 增加对FileTransfer类的支持,使得可以在Explorer和Nautilus文件管理器之间进行copy/paste操作
  • 对项目浏览器作出几项改进
  • 文本编辑器现在支持块选择模式(也就是按列选择或矩形块选择)
  • 你现在可以直接在Synchronize视图中应用一个补丁
  • 在Eclipse中比较Word文档变化,现在使用该Word比较功能支持把变化显示为修订

Equinox

  • 增强Equinox DebugOptions API,以支持选项设置的动态变化
  • 增加一个新的debug跟踪API——org.eclipse.osgi.service.debug.DebugTrace,以增强并简化编写debug跟踪信息
  • OSGi R4.2核心规范给核心框架增加了一些小API
  • 新的Equinox并发API

Plug-in开发环境

  • 有一个新的Target Platform State(目标平台状态)视图
  • 你现在可以创建并共享一个由软件站点的软件组成的目标定义
  • 新的Category Definition编辑器可以在输出时用于给特性归类
  • 你现在可以查看API相对于API基线的变化
  • 通过在菜单introspection mode里调用plug-in Spy来查看关于菜单的信息
  • 增强OSGi Declarative Services (DS),以支持最新版的DS规范
  • 你现在可以从OSGi启动配置中初始化产品定义
  • 有一个新的目标平台偏好页面
  • PPlug-in export现在支持创建source bundles
  • Declarative Services现在支持最新版的OSGi declarative services规范(1.1)更新
  • PDE中的JAR signing支持扩展包含了对keypass的支持
  • 增强目标编辑器,以支持目标定义中的新特性
  • API工具现在可以分析系统类库的使用情况及代码访问运行时不存在的成员时所产生的问题
  • 你现可以在非UI线程中启动Junit Plug-in测试
  • Eclipse应用程序启动配置现在支持启动级别(start level)及自动启动设置
  • Plug-in Registry视图现在支持浏览OSGi服务
  • 给PDE/Build增加了一个新的扩展,可以使用户从p2库中获取制品
  • API工具现在支持在接口上的两个约束:@noimplement 和 @noextend。这就使得在不想直接实现一个接口的时候可以扩展它
  • 即使你已经增大了plug-in的主版本号,仍会被提示破坏API的改变
  • PDE增强了bundle及特性(feature)输出,以把输出的bundles/feature安装到当前正在运行的工作台
  • 输出特性、plug-in及产品时可以选择binary cycles
  • PDE增加了declarative services工具,以帮助作者提供组件定义

Java开发工具

  • NLS string hover现在有一个Open in Properties File动作
  • 在Caller模式下,调用层级(Call Hierarchy)现在有一个在上下文菜单中有一个Expand With Constructors动作
  • 当你在编辑器中输入的时候,Java比较编辑器会更新其结构
  • 有一个新的toString()产生器
  • 为可覆盖方法增加了一个Open Implementation链接,可以直接打开其实现
  • 编辑器与执行环境一致
  • Debug视图现在提供了breadcrumb(面包屑),显示了当前活动的debug上下文
  • 可运行的JAR文件输出向导还可以把所需的类库打包进一个要输出的可运行JAR文件,或打包进与紧挨着该JAR的一个目录中
  • 当在写一个分配表达式(allocation expression)时发生补全操作,内容助手现在可以提示一个类的可用构造方法
  • 如果检测到无用代码,编译器现在可以发出警告
  • 类库、变量或容器入口的路径现在可以是与项目相关的任何位置
  • 在Jovadoc hover的头部及Javadoc视图中,现在都提供了引用其他类型和成员的链接
  • 随该Eclipse发行的JUnit4版本更新为4.5
  • Javadoc视图及hovers现在都支持{@inheritDoc}标签并给覆盖方法增加链接
  • 同一值的比较现在由编译器检测,默认情况下会发出警告

Java代码调用JavaFX的例子

June 23rd, 2009

在JavaFX 1.0发布之后,本人撰写的文章JavaFX和Java之间的互操作性被各网站转载。文中总结了3种从Java调用JavaFX的方法。这三种方法分别为: http://www.javafxblogs.com

1. 用ScriptEngineManager类。这是基于JSR-223规范的java脚本API( scripting API)。可以在java程序中运行一些脚本,如 JavaFX script, javascript等。
2. 通过JavaFX reflection API。这是JavaFX提供的反射API,几乎可以调用所有的JavaFX类。
3. 先用JavaFX类实现一个Java的interface,然后Java程序可以通过这个interface来调用JavaFX的功能。这中间的interface起了个桥梁的作用。

第三种方法应该是比较“正规”而且“优美”的调用方式。但是也有一点不足:程序代码的入口必须从JavaFX启动。这是因为JavaFX程序比 较容易生成JavaFX类的实例,从而可以供Java方使用。可是我们有时会碰到一些特定的情况,需要从Java端启动代码。例如,如果你已经有了一个较 完整的Java程序,你需要用调用JavaFX的某些功能,这时候较好的方法是把Java作为程序的入口。为了解决这个问题,我把第2和第3种方法作了融 合,大家可以看看下面的例子。纯Java代码调用JavaFX的例子

www.JavaFXblogs.com

下一步是创建JavaFX类MyChart来实现这个interface:

www.JavaFXblogs.com www.JavaFXblogs.com

www.JavaFXblogs.com
在代码中,这3句是创建JavaFX类javatest.MyChart实例,

    Context context = FXLocal.getContext();
    FXClassType instance = context.findClass("javatest.MyChart");
    ObjectValue obj = (ObjectValue)instance.newInstance();

而一下这句则是把JavaFX实例转化为Java可用的对象:

    JavaInterface ji = (JavaInterface)obj.asObject();

如果你用的是NetBeans IDE, 你可以在项目属性中把javatest.JavaTest类设为主类(Main class)(即启动类)。编译之后会生成一个javatest.jar文件。程序运行的结果如图:

Java PieChart via JavaFX
在命令行中可以采用以下方式: http://developers.sun.com/blog/henry

   javafx -jar javatest.jar

实际上,可以用纯Java的方式来启动程序,只要把JavaFX的运行环境带上即可,如:JavaFX程序例子、教程

 java -Djava.library.path="<path to javafx sdk lib>"
     -classpath "<all javafx sdk jars>" -jar javatest.jar

因为JavaFX需要的jar文件很多,因此这种“最纯”的java方法使用起来比较麻烦。我觉得还是用javafx命令简洁些, 而且javafx就是上述java命令的封装而已。

如果有问题,请留言讨论。

本文的英文译文同步发表于:Calling JavaFX Classes from Pure Java Code. 中文同步发表于:用纯Java代码调用JavaFX的功能

JavaFX 1.2中的五大重要性能

June 22nd, 2009

在已经结束的JavaOne大会上推出了许多与JavaFX相关的产品,其中一些是关于未来的产品,还有一些则尚未发布。本文当然不会对此一一列举。 在JavaOne会议期间讨论了许多议题,而笔者认为JavaFX最关键的一些性能可能被忽略了。在本文中,笔者将谈及的是一些你现在实实在在能下载且使 用的功能。本文中谈及的均是JavaFX的新版本,也就是以前代号为Marina,现在称为JavaFX 1.2的版本。闲话少说,以下是本人总结的五大重要性能。

支持Linux和Solaris

在Linux和Solaris之下对JavaFX的支持已经让我们等了相当长一段时间。经历千辛万苦,我们现在终于迎来了测试版。我们的目标是让 Solaris和Linux成为JavaFX世界中与Windows和Mac具有同等地位的平台。JavaFX的目标是要让一种Java能适应所有屏幕以 及所有的操作系统。这是向该目标又靠近了一步。

有些功能还不能使用,这也是为什么我们称其为测试版的原因,但是它仍然是一个良好的开 端。我们现在使用支持视频的GStreamer,曾是缺少的一个关键性能。你有可能会获得一些图像硬件加速功能,当然这要取决于你的distro组件和配 置。阴影窗口还不能使用。这是因为基础JRE中存在漏洞。负责图形处理的程序师称他们已经针对这一漏洞开发出了补丁,而该补丁预计会在不久后的Java6 和OpenJDK中推出,因此你不需要等到下一版本的 JavaFX。

控件和布局

JavaFX具备非常好的图形处理但是在1.0版本中只有单独的本地用户界面控件TextBox。而仅仅是使用文本控件很难制作出真正意义上的商业应用 程序。这一切现在都有所改变。JavaFX 1.2 拥有真正适合21世纪的用户界面控件。我们总是在爱恨中徘徊,思考着长远的用户界面工具包的发展趋势。然后我们会创建出新的控件并且API布局,这些努力 解决了人们所需的一部分应用程序。而这里只是对新控件粗略做一下介绍:

·所有的控件都可以用CSS更换皮肤,因此设计师可以创造出一般式样的程序。

·存在一个默认的控件观感Caspian。

·控件位于公用文件参数中,这意味着他们可以在所有设备上运行而不只是桌面。

·用于标准性能的新型控件,如进程指示器和超链接。

·都是建立在JavaFX布景图之上,因此不会有剩余的AWT。

和这些控件一起出来的是布局系统,它能处理AWT布局的问题。现在要将布局和动画综合起来就变得非常容易了,而且只需用几行代码就可以创建自定义的布局。使用这些控件,我们可以创建真正意义上能跨屏幕运行的商业程序。

当前列表中缺少一些控件。尤其是Tablet和Tree的缺失。这并不意味着开发团队无意向其中添加这些控件。主要是因为没有足够的时间来添加。不过将来这些控件还是会提供的。

和控件一起用来创建商业程序的另一个重要性能是图表。图表是JavaFX中创建的一种非常常见的请求。所有的标准图表类型包括饼图,分散图和条形图,使用起来是十分便捷的。你还可以用代码来创建自己需要的图表类型。下面是几个示例:

数据:持久性,RSS/Atom和任务

以前,你只能通过下降到Java代码的办法才能使用数据。这个办法通常都有用,除非移动Java代码与桌面Java代码不同。此外,每种形式的 Java都有自己的独有API可以保持数据。为了解决这一问题,开发团队在JavaFX公用参数文件中添加了新的支持以便保留这种平台差异。以下是新添加 的一些支持:

·javafx.io.Storage 用来在任意客户平台上实现本地数据的保留

·javafx.data.feed.* 对RSS和Atom数据的嵌入式支持

·DateTime,Math,and Properties 作为JavaFX类

·javafx.async.* 用于JavaFX中所有异步操作的基本类,包括执行Java任务的方式。

速度

JavaFX的目标就是让每个使用它的人都享受到更快的更新速度。你会发现JavaFX 1.2要比1.1和1.0更快。从启动时间,内存使用情况和图形处理性能来看,每个部分的性能都有所改进。对于某些任务其性能更是有了多达三倍的改进。

为了实现这种速度的改进,程序员重新审视过整个平台。编译器从使用真正多重继承转为Mixins。这样就消除了多重继承的弊病。附带的好处就是基本汇编代码变得更小且更快。

图形开发小组花了大量的时间来重新设计场景图以便实现更智能化的场景更新。其结果是减少了用户重新绘制的次数,带来了反响更好的用户界面。

在视频和音频堆栈以及基本图形流水线里都存在漏洞补丁。此外,减少了启动时间并改善了Webstart的性能。总之你会发现JavaFX 1.2为用户带来了比以往更为快速而流畅的体验。

上述五个性能还只是JavaFX 1.2中的很小一部分。最重要的一点是这些都是JavaFX开发计划的一部分。更快与更小的特性确保了程序员能高速高效地为客户开发出高质量的软件。

ComponentOne公司发布Silverlight代码压缩工具XapOptimizer

June 22nd, 2009

根据国外媒体报道,ComponentOne公司日前发布了一个名 叫XapOptimizer的工具,它可以通过去除没有被使用到的类和XAML资源的方法来减小XAP文件的尺寸。这将会减小Silverlight编写 的RIA程序的体积,从而缩短下载时间,并能降低网络资源符合,同时还能提高代码的安全性。

ComponentOne XapOptimizer是严谨的Silverlight程序员的终极利器,ComponentOne公司的Chris Meredith说道,Silverlight程序的体积可以减小到原来的70%,而不会有任何功能上的损失。根据Meredith的表述,任何 Silverlight开发者都可以体会到XapOptimizer带来的便利,不论他们是否使用了第三方控件。XapOptimizer会在建立 (Build)阶段起作用,因此,每次重新建立都会进行自动优化。(CSDN)

Adobe表示HTML5将不会取代Flash

June 20th, 2009

HTML5已经包含了网页影音富媒体的相关标签,这对于许多依赖插件才能运行的网络媒体标准而言是一个巨大的威胁,Adobe Flash就是其中的一个.
Adobe首席执行官Shantanu Narayen却不这么看,他坚持认为就算到了HTML5时代,Flash将依然和它的富媒体特性一起存在,他还认为,Flash只会变得更为重要.

所有旁观者都预测Adobe已经对HTML5开始了防御性策略,一些博客表示Adobe公司已经出现了对开放式标准的某些“敌意”的迹象.

Adobe上一季度的利润下降了41%,但股价依然保持稳定,这表明投资者看到利润下降的原因是经济问题,而不是与该公司或其产品.

但如果YouTube在某一天直接沿用HTML5的富媒体特性,这将对Adobe公司的产品信心是一个重大打击.

新闻HTML 5 会为 Flash 和 Silverlight 送终吗?

June 18th, 2009

W3C 在 HTML 5 proposal 中为 HTML 5 赋予了这样的使命,它将弥补上一代 HTML 的不足,具体说,是实现 Flash, Silverlight, JavaFX 所能实现的功能。 HTML 5,这个 HTML 明日之星是否会改变 Web 应用的游戏规则,是否会让这些富 Web 插件成为历史,InfoWorld 的专栏作家 Paul Krill 为此撰文并作了论述。

HTML 5 的富承诺

Ajaxian 网站的合伙创始人及 Mozilla 开发工具指导员 Dion Almaer 说,在为 Web 提供矢量图形和视频方面,HTML 5 事实上晚了一步。 HTML 5 中,诸如 Canvas 一类的 2D 绘图技术,一直为 Apple, Google, 以及 Mozilla 这类公司所重视(尽管微软也对 HTML 5 的部分功能表示赞赏,但他们至今也不支持 Canvas)。

HTML 5 中,Canvas, 本地存储, Web Workers 一类的功能可以让我们做更多事。另一位Ajaxian 网站的合伙创始人及 Mozilla 开发工具指导员 Ben Galbraith 说,本地存储可以让用户在离线状态下继续使用 Web,而 Web Workers 让下一代 Web 应用中的复杂运算变得轻松,让一些需要很长时间运行的任务在后台运行。

Google Chrome 浏览器 项目经理 Ian Fette 说, Web 应用将变得更有趣,他们会变得更快,会提供更好的用户体验,让在线 Web 应用和桌面应用之间的界限越来越模糊。

HTML 5 的部分功能已经实现

经过5年的工作,HTML 5 细则已于2008年发布,其中的部分细则已经在某些浏览器得以实现,然而 HTML 5 的全部功能仍然不会在近几年内完成。

Mozilla Firefox 项目技术主管 Vlad Vukicevic 说, HTML 5 支持视频,而 Firefox 3.5 也刚刚新加了视频支持,Google Chrome 也支持视频标签,微软在 Internet Explorer 8 中支持某些 HTML 5 功能,如本地存储,AJAX 导航,以及多个 DOM 原型。

Opera 公司的 Web 宣讲人 Molly E. Holzschlag 表示, Opera 支持 Canvas,并计划支持视频。Apple 也在其 Safari 浏览器支持视频和音频标签,以及 Canvas 技术(Canvas 就是苹果发明的)。

HTML 5 的一面: 扔掉那些插件

Almaer 说,尽管 Adobe,微软,SUN (即将成为 Oracle) 这些公司已经分别在 Web 中实现了他们自己的多媒体技术,HTML 5 最终可能抢去他们的饭碗。RedMonk 分析师 Michael Cote 说,本质上,HTML 5 所能做的和这些公司所做的没有区别,JavaFX 也将受到威胁。

HTML 5 细则的合作设计者 Ian Hickson 表示,HTML 5 的目标是将 Web 从那些非开放性富插件中解放出来,他们是独立的提供商,不适合开放的 Web。Hickson 说,使用专门公司的产品对开发的 Web 是一种风险,如果他们停止开发,或开始收费将怎么办?Hickson 补充道,象以前的 Windows 一样,如果我们的主要开发平台控制在单一的供应商手中会是很可怕的。

Firefox 主管 Vukicevic 说,Mozilla 希望保持开放,并保证视频一类的技术不是掌握在某些公司手中,不过 HTML 5 和 Canvas 最终是否能真正取代 Flash,Silverlight 以及 JavaFX,还取决于开发者。Vukicevic 认为,IE8 不支持 HTML 5 的一些功能,对开发者来说是一个问题,鉴于 IE 浏览器到市场份额,开发者要么使用微软的 API 提供额外开发,要么使用 Flash 一类的技术。

插件的一面: 他们更好,而且已经实现了

尽管 Adobe, 微软 以及 SUN 都参与了 HTML 5 细则的制定,他们都表示自己的技术是必要的。HTML 5 仍是一个发展中的标准,可能需要5到10年才能最终完成,因此,现在做比较还为时过早。微软发言人表示,Silverlight 仍有必要存在,因为它包含了一些高级功能,如更好的编程模型, C#,3D 功能以及可以在浏览器之外运行的功能。

Adobe 的开发工具副总裁 Dave Story 表示,HTML 5 面临很多挑战,浏览器市场仍然很零散,浏览器之间的兼容问题非常严重,HTML 5 的时间线显示,最终 HTML 5 + CSS 3 可能要 10年的时间才能定稿,在这期间,Flash 会持续发展,并提供更好的用户体验。

SUN 副总裁,也是被号称为 Java 之父的 James Gosling 表示,JavaFX 在渲染,性能,表现方面比 HTML 5 要优秀得多。

分析师 Cote 表示,目前这些富 Web 插件还没有眼下的威胁,要实现这些插件中的功能还要很多年,他希望即使 HTML 5 发布之后,这些插件技术仍能继续存在。Google 的 Fette 也同意,HTML 5 只是一个起始点,Google 一类的公司还会推出自己的技术,如向 Web 拖放图片的技术。

几家行业巨头将面临抉择

参与 HTML 5 的公司,大多要么是浏览器厂商,要么是富 Web 应用工具开发商,很少二者都是,微软除外,Almaer 说,微软也将因此进入两难境地,微软在 Silverlight 上花了很大力气,Silverlight 团队存在的意义是为浏览器提供增强,如果 HTML 5 轻易实现了,还要 Silverligth 做什么。

Google 也将不得不遇到某些抉择,比如,他们的 Youtube 使用 Flash 实现视频,HTML 5 对视频的支持将让他们重新考虑这个问题,他们需要在成本和效益方面艰难抉择。

本文国际来源:http://www.infoworld.com/d/developer-world/html-5-could-it-kill-flash-and-silverlight-291
中文翻译来源:COMSHARP CMS 官方网站

AdobeFlex编码指南

June 17th, 2009

一、介绍:
该文档旨在为使用Adobe Flex 和 ActionScript 3 编写应用程序建立编码指南。

要创建通俗易懂的编码规范,因为在软件开发的生命周期中,大部分时间都是在维护。这样,
易于理解的代码片段变得很重要,因为不总是最初的开发者去维护代码。通俗地说就是,让开
发者能快速理解别人的代码。除此之外,程序或组件也可以方便地部署或销售给第三方。

制订编码规范的前提 :通用性 易理解性

该文档中创建的实例是基于DClick 的工作方法,Java 编码约定和Adobe Flex SDK 中的约定。

二、文件:
2.1 文件扩展名

MXML 代码:.mxml

ActionScript 代码:.as

CSS 代码:.css
2.2 文件名不能包含空格、标点和特殊符号

ActionScript   类和接口使用开头字母大写的驼峰式命名例:ExampleClassName

接口总是以一个大写字母I开头例:IExampleInterface

包含(includes)使用开头字母小写的驼峰式命名;

命名空间使用开头字母小写的驼峰式命名例:myNamespace

MXML    总是使用开头字母大写的驼峰式命名

CSS    总是使用开头字母小写的驼峰式命名
2.3 编码
所有文件都必须使用UTF-8 编码

三、ActionScript 3.0:
3.1 文件结构
ActionScript 文件必须包含以下组成部分:

1   开篇注释
2   定义包
3   声明命名空间

一个文件要定义命名空间,如果存在命名空间,这是最后部分 空间,这么做就行了
4 Import 描述 按字母顺序排序;
1. flash 包 如果导入命名空间,
2. mx 包 同名的包要先于类
3. com.adobe 包
4. 公司组件
5. 第三方包,按字母顺序排序
6. 属于该文件的工程包

使用完整的引用名,不要使用星号(*),除非使用了包的绝大部分。
推荐使用:importmx.core.Application
避免使用:importmx.core.*
5   use 声明(命名空间) 按字母顺序排序
6   元数据
1. Event
2. Style
3. Effect
4. 其他元数据,按字母顺序排序
7   定义包和接口
8   静态变量(static)
1. public
a) const
b) 其他publicstatic
2. internal
3. protected
4. private
5. 自定义命名空间(按字母顺序排序)
9   没有使用getter 和setter 的变量
1. public
2. internal
3. protected
4. private
5. 自定义命名空间(按字母顺序排序)
10   构造函数
11用getter和setter处理的变量和方法本身,还有相关的变量, 相关规则参考文档中
例: 关于变量的部分
private var_enabled:Boolean=true;
private var enabledChanged:Boolean = false;
public function getenabled():Boolean{
return_enabled;
}
public function setenabled(value:Boolean):void{
_enabled = value;
enabledChanged = true;
}
12方法 将实现相关功能方法组织在一起,而不是按作用域
3.2 样式
3.2.1 行与换行
如果一段描述不能放在一行中,依据下列规则将其拆分成多行:从逗号后换行; 最好在较高级别代码处换行;    换行后与上一行对齐;    如果上一条规则不适用,加入两个缩进

推荐使用:
//第一行:在 implements 操作符之前换行
//第二行:在逗号后面换行
//第二、三行:两个缩进
public classButton extends UIComponent
implements IDataRenderer, IDropInListItemRenderer,
IFocusManagerComponent
避免使用:
public classButton extends UIComponent
implements IDataRenderer, IDropInListItemRenderer,
IFocusManagerComponent
推荐使用:
//在高级别代码处换行,例如右小括号
//不要在括号内换行
variable1 = variable2 + (variable3 * variable4 – variable5)
- variable6 / variable7;
避免使用:
variable1 = variable2 + (variable3 * variable4
- variable5) – variable6 / variable7;
三元操作符换行示例:
b = (expression) ? expression
: gamma;//对齐!
c = (expression)
? beta
: gamma;
3.2.2 声明       每行只有一个声明。
正确的:
var a:int = 10;
var b:int = 20;
错误的:
var a:int = 10, b:int = 20;

尽量对变量进行初始化,如果一些变量的初始值在方法调用中付给则不需要初始化。即使是默认值也要初始化。
正确的:
public var isAdmin:Boolean = false;
错误的:
public var isAdmin:Boolean; //Boolean 型变量的默认值是false

变量的声明放在代码块开始的位置,除非是在循环中。
public function getMetadata():void{
varvalue:int = 123;//方法代码块开始

if (condition){
var value:int = 456;//if 开始

}
for (var i:int = 0; I < valor; i++){//在for 循环中

}
}

不要使用之前代码块中用过的变量名,即使是不同的作用域。
3.2.3 括号
样式规则:
不要在方法名和括号之间插入空格,也不要在括号和参数间插空格;    不要在对象名和类型间插空格;    左大括号放在新的一行并与方法定义行对齐;    右大括号独占一行并与跟成对的左大括号对齐;    方法间用一空行隔开;
3.2.4 声明
简单的
简单声明每行只能有一个,并以分号作为结束。
正确的:
i++;
setModel();
错误的:
i++; resetModel();

复合的
复合声明(其中要使用大括号的,例如if, while, switch)必须遵守以下原则:    声明内的代码要缩进一级;    左大括号在声明下方独占一行,与声明对齐,右大括号同样占一行,与左大括号对齐;    在所有声明中都使用大括号,即使声明只有一行;

返回(return)
返回无需使用小括号,除非你想使代码更容易理解:
return;
return getFinalImage();
return (phase ? phase : initPhase);

条件语句 if, elseif, else
if (condition)
{
simpleStatement;
}

if (condition)
{
statements;
}
else
{
statements;
}

if (condition)
{
statements;
}
elseif (condition)
{
statements;
}
else
{
statements;
}

条件语句 switch, case
Switch 声明适用下面的样式:
switch (condition)
{
case ABC:
{
statements;
//continue,withoutbreak
}
case DEF:
{
statements;
break;
}
case JKL:
case XYZ:
{
statements;
break;
}
default:
{
statements;
break;
}
}

Break 规则:    在default 代码块中也要使用break。通常这是多余的,但他能增强代码的可读性;    如果一段代码块中不需要break,在 break 的位置上写上注释;    如果声明中包含return 则不需要使用break。

循环 for
for (initialization; condition; update)
{
statements;
}
for (initialization; condition; update);

循环 for..in
for (var iterator:type in someObject)
{
statements;
}

循环 foreach..in
foreach (var iterator:Type in someObject)
{
statements;
}

循环 while
while (condition)
{
statements;
}

循环 do..while
do
{
statements;
}
while (condition);

错误处理 try..catch..finally
try
{
statements;
}
catch (e:Type)
{
statements;
}

也可以有finally 声明:
try
{
statements;
}
catch (e:Type)
{
statements;
}
finally
{
statements;
}

With
with (this)
{
alpha = 0.5;
}
3.2.5 换行与空格
换行(这里指一空行)
换行能使代码看上去更清晰,更有逻辑。
下列情况需要换行:    函数之间;    方法的局部变量和声明之间;    代码块前;    单行注释前面或一段特殊功能代码的多行注释前面;    将一段代码的逻辑之间分开,使代码更清晰。

空格
在关键字和小括号之间插入空格,但不要在方法和他的小括号中插入空格。
while (true)
{
getSomething();
}

在方法的形参列表中,逗号后面要有空格:
addSomthing(data1, data2, data3)

所有操作符(两个操作数之间的,例如+,-,=,==)与其操作数之间要用空格分隔,但不要
分割一元操作符(例如++,–)。
a += (5 + b) / c;
while (basint < f)
{
i++;
}

三元操作符要用空格分开,有必要的话可以拆分成多行:
a = (expression) ? expression : expression;

for 表达式中要用空格分开:
for (expr1; expr2; expr3)
3.3 注释
3.3.1 文档注释
文档注释是指在每个类、接口、变量、方法以及元标签等定义前面放置的一段注释,文档注释
的作用是,让那些将要使用这些定义的人能更好的了解定义的作用,而无需去研究代码。

文档注释的语法和格式参考 ASDoc(在 Flex SDK 中也可以找到),地址是:
http://labs.adobe.com/wiki/index.php/ASDoc:Creating_ASDoc_Comments

例如:
/**
*The Button control is a commonly used rectangular button.
*Button controls look like they can be pressed.
*
*@mxml
*
*…
*
*@includeExample examples/ButtonExample.mxml
*/
public class Button extends UIComponent
3.3.2 执行注释
执行注释用来对一些不易理解的特殊代码进行说明,使用//进行注释,不管是多行还是单行。

如果注释独占一行,要将注释放在相关代码之前:
// 确定没有可见列
if (!visibleColumns || visibleColumns.length == 0)
如果不是太长,注释可以和代码放在同一行:
colNum = 0; // 补偿可见初始列的偏移量
不要翻译代码:
colNum = 0; // 把列数设为0
四、MXML
4.1 文件结构
MXML 文件必须包括以下组成部分:

1 XML 文件头 总是在文件头中定义编码,并
<?xml version=”1.0” encoding=”UTF-8” ?>
且总是使用UTF-8 编码
2 根标签 必须包含文件中使用到的所有命名空间
3   元标签
1. Event
2. Style
3. Effect
4. 其他元标签,按字母顺序排列
4 定义样式 尽量使用外部样式文件
5 定义脚本 只能存在一个脚本块
6   非可视组件
7   可视组件
4.2 样式
4.2.1 行与换行
在一组可视组件之间插入空白行可使代码更清晰

在同一个父组件的子组件之间(也包括他们的子组件)插入空白行,如果这个子组件拥有至少
一个子组件:

<mx:series>
<mx:ColumnSeries yField=”prev” displayName=”Forecast”>
<mx:stroke>
<mx:Stroke color=”0xB35A00″ />
</mx:stroke>
<mx:fill>
<mx:LinearGradient angle=”0″>
<mx:entries>
<mx:GradientEntry… />
<mx:GradientEntry… />
</mx:entries>
</mx:LinearGradient>
</mx:fill>
</mx:ColumnSeries>
<comp:ColumnSeriesComponent />
</mx:series>

也就是说,如果一个组件之有一个子组件则不需要插入空白行。下面的LinearGradient 就
只有一个子组件 entries.

<mx:LinearGradient angle=”0″>
<mx:entries>
<mx:GradientEntry… />
<mx:GradientEntry… />
</mx:entries>
</mx:LinearGradient>

同样,像entries 这样子组件都在一行的也不用插入空白行
<mx:entries>
<mx:GradientEntry… />
<mx:GradientEntry… />
</mx:entries>
4.2.2 Nstling components(雏鸟组件?)
子组件必须依据其父组件进行缩进排版。

<mx:TabNavigator>
<mx:Container>
<mx:Button />
</mx:Container>
</mx:TabNavigator>
4.2.3 属性
按下列顺序排序:    属性    如果有id 的话,永远放在第一位;    记住,width,height 和styleName 是属性而不是样式;    事件(Events)    效果(Effects)    样式(Style)

如果有id,永远放在第一位。
<mx:ViewTack id=”mainModules” width=”75%” height=”75%” />

标签属性如果放在多行要进行缩进。
<mx:Label
width=”100%” height=”100%” truncateToFit=”true”
text=”Herecomesalongenoughtextthat…” />

如果标签的声明有多行,处在第一行的永远只有id 一个属性,其他属性按上面的顺序放在其
他行中。
<mx:ViewStack id=”mainModules”
height=”75%” width=”75%”
paddingTop=”10″ paddingLeft=”10″ paddingRight=”10″>

<mx:ViewStack
height=”75%” width=”75%”
paddingTop=”10″ paddingLeft=”10″ paddingRight=”10″>

同一类的属性放在一行,下面的例子中第二行定义了属性,第三行定义事件,第四行定义样式,
最后一行是效果。
<mx:Panel
title=”VBoxContainerExample” status=”Somestatus”
hide=”doSomething()” creationComplete=”doSomething()”
paddingTop=”10″ paddingLeft=”10″ paddingRight=”10″
resizeEffect=”Resize”/>

在同类属性需要放入多行的情况下,视乎情况将更为相近的属性放入同一行,下例中第四、五
行均为样式,第五行定义了一些 padding:
<mx:Panel id=”pnLoginInfo”
title=”VBoxContainerExample” height=”75%” width=”75%”
resize=”resizeHandler(event)”
titleStyleName=”titleLogin” headerHeight=”25″
paddingTop=”10″ paddingLeft=”10″ paddingRight=”10″ />
4.2.4 脚本
脚本代码块的样式:
<mx:Script>
<![CDATA[
code;
]]>
</mx:Script>
4.3 注释
4.3.1 文档注释
ASDoc 工具不支持MXML 文件中的文档注释,但还是鼓励这样去做,如果MXML 文件是一个可
重用的自定义组件(不只是简单的视图)。这样,文件中就包含了一个与 ActionScript 注
释方法相同的脚本代码块。
<mx:Script>
<![CDATA[
/**
*Document ation comment inside a MXML component
*Uses the same format as the AS comment
*/
]]>
</mx:Script>
4.3.2 执行注释
使用执行注释描述那些目的不太清晰的界面元素
<!—这里是注释–>
或使用多行
<!–
多行注释

–>

五、样式
5.1 一般规则    缩进使用制表符,占4 空格位,需要在IDE 中进行设置;    单行代码不超过100 个字符;

注:使用Eclipse 配以1280 分辨率,如果编码窗口占70%(其他30%用于导航),每行大
约可以显示103个字符,A4大小纸张一行大约80个字符。

六、命名
6.1 一般规则    缩写:应尽量避免使用缩写,除非是那些缩写形式更常用于它的全称的缩写(例如URL,
HTML 等)。工程名可以是用缩写,如果他就是叫那个名字。    只使用AscII 字符,不包括重音符号(`)、空格、标点和特殊字符;    不要使用 FlexSDK 中预留的关键字命名(像 mx 包中的 Application、DataGrid
等),也不要使用 FlashPlayer 中预留的关键字(像 Flash 包中的 IOError、
Bitmap 等)    既然在MXML 中编写代码与在 ActionScript 中一样容易,在MXML 中的命名规则也
和ActionScript中是一样的(举例来说,一个MXML就像一个ActionScript类,
其内部的组件和变量等同于属性)    主程序文件命名为Main.mxml    不要在组件名称中使用索引,以免在用ASDoc 工具生成文档时产生冲突。
6.2 语言
编码本身必须使用英语,除了涉及到商业领域的动词和名词(特殊专业领域的软件是为了解决
问题,也就是说,现实世界和系统是相关联的)

因此,推荐使用下面的命名:
DEFAULT_CATEGORIA
addNotaFiscal()
getProdutosByCategoria()
changeState()
UsuarioVO
screens/Reports.mxml

不推荐下列命名:
popularCombo()
mudarEstado()
UsuarioObjetoDeTransferencia
6.3 包
包的命名必须使用 lowerCamelCase(驼峰式命名),第一个单词的开头字母小写,其他单
词的开头字母大写

包名的第一部分使用顶级域(com, org, mil, edu, net 或gov)或者使用两个单词,国
家标识加顶级域,参考文档ISO3166(br.com, ar.edu, cn.org 等)

下一部分是所有者(公司或客户)的名称,接下来是工程名和模块:
cn.com.company.project.module
6.4 类
类名推荐使用名词,也可以使用形容词。总是使用UpperCamelCase(开头字母大写的驼峰
式命名)形式
6.5 接口
接口的命名规则和类的是一样的,只是开头加上一个大写字母I
6.6 方法
方法必须使用动词开头,并使用lowerCamelCase(开头字母小写的驼峰式命名)形式,如
果方法被一个事件调用,结尾加上Handler
6.7 变量
变量使用 lowerCamelCase 形式命名,并且使用有意义的名称,如果变量使用 getter 和
setter 方法读/写值,开头应加上下划线(_)

变量不必使用前缀,在ActionScript 中给对象一个通俗易懂的名字比对象类型更重要。尽
管如此,Boolean 型变量应以can、is 和has 开头。

临时变量(例如在循环中)通常使用一个字母,最常用的字母是 i, j, k, m, n, c, d。
不要使用 l。

catch 中的变量必须使用e,不管错误类型为何(如果他是个类)
6.8 常量
常量全部使用大写字母,单词间用下划线分割(_)
6.9 命名空间
命名空间全部使用小写字母,单词间用下划线分割(_)
文件名必须与命名空间名称一致。
七、一般习惯    在注释中使用FIXME 关键字来标识某些需 TODO 标识某
时需要改良的代码,这可以使用Flex Builder 2 Task 插件;    将需要重复调用的值在使用指派给一个变量,这对提高性能相当有用(在简单的
中不需要)
正确的:
var maxPhase:int = reallySlowMethod();
for (var i:Number = 0; I < maxPhase; i++)
{
statements;
}
正确的:
var months:Array = ['Jan', 'Fev', 'Mar'];
// 获取数组长度是相当快的
// 这样做同时还增强了代码的可读性
for (var i:Number = 0; I < months.length; i++)
{
trace (months[i]);
}
错误的:
for (var i:Number = 0; I < reallySlowMethod(); i++)
{
statements;
}    尽量使用松耦合的组件,组件之间的关连越少,其重复利用的可能越大;    在Boolean 判断中,将速度快的放前面。
正确的:
if (isAdmin && slowMethod(item))
错误的:
if (slowMethod(item) && isAdmin)    如果可用,尽量使用常量    如果可用,尽量使用更精确的类型    建议在简单的事件处理中使用匿名函数

八、附录:预留关键字
下表中列出了ActionScript 3 中的预留关键字:

as break case catch
class const continue default
delete do else extends
false finally for function
if implements import in
instanceof interface internal is
native new null package
private protected public return
super switch this throw
to true try typeof
use var void while
with

还有些语法关键字,在某

each get set namespace
include dynamic final native
override static

还有些为未来版本预留的关键字也应尽量避免使用:

abstract boolean byte cast
char debugger double enum
export float goto intrinsic
long prototype short synchronized
throws to transient type
virtual volatile