Flash右键功能
- 12月 29th, 2008
-
很兴奋啊~现在Js部分是实现了,期待哪个牛人再把As部分封装….瓦咔咔
Example:http://www.uza.lt/rightclick/
很兴奋啊~现在Js部分是实现了,期待哪个牛人再把As部分封装….瓦咔咔
Example:http://www.uza.lt/rightclick/
貌似最近事很多,Flash CS4 出来这么长时间了,还只是看了一点点新特性,下面这些是新特性的官方文档,虽然Flash Cs4的文档里也有,但是需要找…和我一样懒的同学们可以直接看下面这几个链接就好。
绘图 API 高级用法
使用反向运动
在三维 (3D) 环境中工作
使用 Pixel Bender 着色器
处理数组 (Vector)
证据为:
新建一Flash,在舞台上放置一个输入文本,取名为tf
第一桢上写
tf.text = tf.tabEnabled.toString();
编译此Flash,并分别在IE和FF下浏览
结论:
如果想统一FF和IE的用户体验,就用代码把输入文本的tabEnabled设置为true或者false
注:这是Flash下的问题,Flex没有验证。
1.项目地址,文档,下载请见 http://www.asual.com/swfaddress/
2.项目引入工程部分略过…
3.第一步注册一个SWFAddress类中的onChange的静态方法:SWFAddress.onChange = onChangeHandler。
4.当用户在Flash里做了一些交互操作,导致了一些变化之后,我们就像把浏览器地址和标题改变一下,以便用户使用“前进、后退、收藏”等功能。
5.改变浏览器地址使用SWFAddress.setValue()这个静态方法。
6.改变浏览器标题使用SWFAddress.setTitle()这个静态方法。
7.还有一个静态方法是SWFAddress.getValue(),这个方法是获取当前页面“URL”的。URL并不是整个的URL,而是类似于锚点的URL。比如http://www.czbin.com/index.html#/hello/这个页面中的Flash使用SWFAddress.getValue(),返回值为/hello/
8.我们可以利用SWFAddress.getValue()返回的不同值,来switch…case,为用户展现不同(收藏)的页面。
9.一个极简的例子
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
creationComplete="init()">
<mx:Script>
<![CDATA[
public function init():void{
SWFAddress.onChange = onChangeHandler;
}
private function onChangeHandler():void{
var value:String = SWFAddress.getValue();
trace(value);
}
public function onClickHome():void{
SWFAddress.setValue("/Home/")
SWFAddress.setTitle("czBin - Home")
}
public function onClickAbout():void{
SWFAddress.setValue("/About/")
SWFAddress.setTitle("czBin - About")
}
]]>
</mx:Script>
<mx:Button label=”Home” click=”onClickHome()”/>
<mx:Button label=”About” y=”100″ click=”onClickAbout()”/>
</mx:Application>
1.搜索引擎的抓取,目前比较靠谱的是通过向自己的Flash里注入一个由所有引擎提供的Class来实现,Google已经为分析提供了类似的Class。
2.浏览器兼容问题,至少需要可以正常的前进,后退及收藏,SWFAddress 解决了前进后退及收藏的问题,但是,需要在Flash内部做大量的配合SWFAddress的处理,Flash IDE下需要制定桢,Flex下需要指定states,这还是很繁琐的。
3.更好的自动更新机制,最好做到 ,只要有网络,就尝试着去检测当前FlashPlayer版本和最高版本,然后提示用户去不去升级。而不是像现在这样,需要自己用Js和Flash去帮Adobe兼容这个事情。
一直以来,如果需要加载另外一个SWF,并与之互动的话,都是用Adobe文档中的
Loader.contentLoaderInfo.applicationDomain.getDefinition(className)
今天猛然发现,原来Loader加载完成后,是可以直接调用原SWF中的方法以及舞台上的对象:
1.新建一个target.fla,第一帧代码如下
function method():void{
trace("Function on ActionSctipt");
}
2.在target.fla的舞台上放置一个文本,取名为textOnStage
3.编译好target.swf文件
4.加载target的SWF使用下面的代码作为文档类
package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
public class T1 extends Sprite
{
private var loader:Loader = new Loader();
public function T1()
{
var req:URLRequest = new URLRequest("target.swf");
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
loader.load(req);
}
public function onComplete(e:Event):void{
Object(loader.content).method();//如果能确定loader.content类型的话,可以直接用类型代替Object,如MovieClip(loader.content)
trace(Object(loader.content).textOnStage.text);
}
}
}
visible ,alpha和removeChild()都可以让对象从舞台上“消失”。
但是哪种更好呢?或者说哪种方式更适合于什么情况下使用呢?
这里有篇文章做了详尽的分析
http://www.insideria.com/2008/11/visible-false-versus-removechi.html
作者很强大,排列组合了所有的可能性,然后分析,最后的结论是:
如果对象真的是不用了,那就removeChild()吧,
如果以后还要用,而且还要照顾到深度管理的问题,那就用visible,
基本上,Alpha=0是不需要用到的。
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Matrix;
import flash.net.URLRequest;
import flash.text.TextField;
public class Example00 extends Sprite
{
private var load:Loader;
public function Example00()
{
super();
load = new Loader()
var req:URLRequest = new URLRequest("http://i3.sinaimg.cn/home/deco/2008/0325/sinahome_Logo.gif")
load.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoad)
load.load(req);
addChild(load);
}
public function onLoad(e:Event):void{
var tf:TextField = new TextField();
tf.text = "Flash复制对象的Bitmap";
addChild(tf);
var bounds:Object = this.getBounds ( this );
var mat:Matrix = new Matrix();
mat.translate ( -bounds.x, -bounds.y );
var buffer:BitmapData = new BitmapData ( this.width+1, this.height+1, true, 0 );
buffer.draw ( this, mat );
var newBuffer:Bitmap = new Bitmap(buffer)
addChild(newBuffer)
newBuffer.x = 100
newBuffer.y = 200
}
}
}
其实就是一个Tween的应用…不过好应用比好技术要更实际,何况技术也很好嘛~
http://blog.greensock.com/liquidstage/
虽说是E文,不过没几行字…
1.如果不能保证一定会有JavaScript的回调函数,在ExternalInterface.call的时候,一定要Try,不然某些浏览器(不是FP)将会使Flash。
2.交互时用一个Object作为参数的容器进行传入传出可以对Js人员很方便,他们封装起来很爽,但是要注意:请Js人员严格传入Object,并且不要尝试在As里面兼容传入Object和String,Number等各种情况。
3.虽然Adobe说FP是无视浏览器的,但是Js不能无视浏览器,要写2套代码,所以有时候,我们的思路也要扩展为写2套代码来兼容浏览器问题。