Archive for the ‘Flash’ Category

  • 证据为:

    新建一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
    		}
    
    	}
    }
  • 1.如果不能保证一定会有JavaScript的回调函数,在ExternalInterface.call的时候,一定要Try,不然某些浏览器(不是FP)将会使Flash。

    2.交互时用一个Object作为参数的容器进行传入传出可以对Js人员很方便,他们封装起来很爽,但是要注意:请Js人员严格传入Object,并且不要尝试在As里面兼容传入Object和String,Number等各种情况。

    3.虽然Adobe说FP是无视浏览器的,但是Js不能无视浏览器,要写2套代码,所以有时候,我们的思路也要扩展为写2套代码来兼容浏览器问题。