Archive for 06月, 2008

  • AS代码(Flex):

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    creationComplete="init()">
    <mx:Script>
    <![CDATA[
    import mx.controls.Alert;
    
    private function init():void{
    ExternalInterface.addCallback("callBack",callBack);
    }
    
    private function asCallJS():void{
    Alert.show(ExternalInterface.call("call"));
    }
    
    private function callBack(s:String):void{
    Alert.show(s);
    }
    ]]>
    </mx:Script>
    <mx:Button label=”读取JS中的数据” click=”asCallJS()”/>
    </mx:Application>
    

    JS代码:

    <script language="javascript" type="text/javascript">
    function call(){
    return 'CZBIN.COM';
    }
    function callBack(){
    document.getElementById("ConnJs").callBack('www.czbin.com');
    }
    </script>
    
  • drawTriangles本质上是来虚拟3D的。
    drawTriangles的第一个参数:vertices:Vector.。这是唯一的一个必要参数,可以指定6个(3对)Number(int不可以),作为Triangle的三个顶点。或者指定6*N个Number,来同时绘出N个Triangles。
    drawTriangles的第二个参数:indices:Vector.。当使用这个参数的时候,drawTriangles的第一个参数vertices的length就不需要为6*N了。Flash会根据第二个参数indices来确定所绘制的Triangles的顶点位置,例如

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()" layout="absolute">
    <mx:Script>
    <![CDATA[
    import mx.core.UIComponent;
    
    private var UI:UIComponent = new UIComponent();
    
    public function init():void
    {
    addChild(UI);
    
    UI.graphics.beginFill(0xFFFFFF);
    
    UI.graphics.drawTriangles(Vector.<Number>([10,10,  100,100,  100,10,
    110, 110,   200, 200,   200, 110]),
    Vector.<int>([0,1,2, 2,4,5]))
    }
    
    ]]>
    </mx:Script>
    </mx:Application>

    这个例子先在第一个参数中指定了12个(6对)点。
    然后用第二个参数来制定,使用哪三个点,来绘制Triangle。
    当然,第一个参数中,可以只设置4个,或者8个点(非6的倍数)。

    drawTriangles的第三个参数:uvtData:Vector.<Number>。这个参数是对填充的图案进行切割的参数。这个参数有两种取值可能。一:8个(4对)值,指定4个点来确定进行切割的四边形。二:12个(4对)值,指定4个点,以及这四个点的相对比例。如下例所示

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()" layout="absolute">
    <mx:Script>
    <![CDATA[
    import flash.display.BitmapData;
    import mx.core.UIComponent;
    
    private var UI:UIComponent = new UIComponent();
    
    [Embed(source = 'Image.jpg')]
    private var FuturImage:Class;
    
    private var bitmapData:BitmapData = (new FuturImage() as Bitmap).bitmapData;
    
    private var x1:Number = -100,    y1:Number = -100,    z1:Number = 0,    t1:Number = 0;
    private var x2:Number = 100,    y2:Number = -100,    z2:Number = 0,    t2:Number = 0;
    private var x3:Number = 100,    y3:Number = 100,    z3:Number = 0,    t3:Number = 0;
    private var x4:Number = -100,    y4:Number = 100,    z4:Number = 0,    t4:Number = 0;
    
    private var indices:Vector.<int> = new Vector.<int>();
    private var vertices:Vector.<Number> = new Vector.<Number>();
    private var uvtData:Vector.<Number> = new Vector.<Number>();
    
    public function init():void
    {
    vertices.push(x1,y1, x2*0.5,y2*0.5, x3*0.5,y3*0.5, x4,y4);
    indices.push(0, 1, 3, 1, 2, 3);
    uvtData.push(0,0,1, 1,0,.5, 1,1,.5, 0,1,1);
    
    UI.x = 200;
    UI.y = 200;
    addChild(UI);
    
    UI.graphics.beginBitmapFill(bitmapData)
    UI.graphics.drawTriangles(vertices, indices, uvtData);
    }
    ]]>
    </mx:Script>
    </mx:Application>
    

    参考文章:http://www.senocular.com/flash/tutorials/flash10drawingapi/

  • 前几天做了一个虚线画图形的类,实现了Flash自带的所有绘图方法,不过在图形很小时,会出现一些BUG,等过些时间修复了再传上来。

    就现在而言,最难实现的应该是圆角矩形,或者说是椭圆。

    这几天又研究了一下,想用一个稍微简单点的公式实现(用角度递增,以前是用贝塞尔曲线做的线段等比递增),先贴上来。角度递增在椭圆的时候会出现线段不等长。但当长短轴相同,也就是圆的时候,还是可以凑合用的…需要的朋友可以照下面的代码研究一下,算法很简单。

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()">
    <mx:Script>
    <![CDATA[
    
    import mx.core.UIComponent;
    
    public function init():void
    {
    var UI:UIComponent = new UIComponent();
    var centerX:Number = 200, centerY:Number = 200;
    var radiusX:Number = 100, radiusY:Number = 150;
    var positionX:Number, positionY:Number;
    var angle:Number = 0;
    var change:Boolean = true;
    var solidAdjust:int = 80;
    var spaceAdjust:int = 100;
    addChild(UI);
    UI.graphics.lineStyle(1);
    UI.graphics.moveTo(centerX+radiusX, centerY);
    
    for (angle; angle <= 2.1*Math.PI;angle ){
    positionX = centerX + Math.cos(angle) * radiusX;
    positionY = centerY + Math.sin(angle) * radiusY;
    if(change){
    UI.graphics.lineTo(positionX, positionY);
    angle += Math.PI / solidAdjust;
    }else{
    UI.graphics.moveTo(positionX, positionY);
    angle += Math.PI / spaceAdjust;
    }
    change = !change;
    }
    }
    ]]>
    </mx:Script>
    </mx:Application>
    
  • 今天看Adobe的FlashPlayer10 Native 3D 的Demo,发现了这样的代码。

    protected function hidePoster(p_event:VideoEvent):void {
    	clip.vid.removeEventListener(VideoEvent.READY, hidePoster);
    	.....
    }
    

    EventListener本身也是要占用资源的,在执行完监听,并且不需要继续监听的时候,立即将其移除是一个很好的习惯。现在公司的Flex项目,是一个很大的企业应用。一直以来这个项目的一个大问题就是性能(同时3000+UI需要显示的时候)。

    虽然EventListener和UI所占的内存不是同一等级的,但养成随时释放内存的习惯,是当今Flex很需要注意的问题。我现在还是认为,Flex在今后与SL的竞争中,其性能问题是举足轻重的。

  • <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()" layout="absolute">
    <mx:Script>
    <![CDATA[
    import mx.core.UIComponent;
    
    private var UI:UIComponent = new UIComponent();
    
    public function init():void
    {
    var commands:Vector.<int> = new Vector.<int>(5, true);
    commands[0] = GraphicsPathCommand.MOVE_TO;
    commands[1] = GraphicsPathCommand.LINE_TO;
    commands[2] = GraphicsPathCommand.LINE_TO;
    commands[3] = GraphicsPathCommand.LINE_TO;
    commands[4] = GraphicsPathCommand.LINE_TO;
    
    var data:Vector.<Number> = new Vector.<Number>(10, true);
    data[0] = 10; // x
    data[1] = 10; // y
    data[2] = 100;
    data[3] = 10;
    data[4] = 100;
    data[5] = 100;
    data[6] = 10;
    data[7] = 100;
    data[8] = 10;
    data[9] = 10;
    
    addChild(UI);
    
    UI.graphics.beginFill(0xFFFFFF);
    UI.graphics.lineStyle(1);
    UI.graphics.drawPath(commands, data);
    }
    
    ]]>
    </mx:Script>
    </mx:Application>
    

    也可以简写成下面这样

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()" layout="absolute">
    <mx:Script>
    <![CDATA[
    import mx.core.UIComponent;
    
    private var UI:UIComponent = new UIComponent();
    
    public function init():void
    {
    addChild(UI);
    
    UI.graphics.beginFill(0xFFFFFF);
    UI.graphics.lineStyle(1);
    UI.graphics.drawPath(
    Vector.<int>([1,2,2,2,2]),
    Vector.<Number>([10,10, 100,10, 100,100, 10,100, 10,10]));
    }
    
    ]]>
    </mx:Script>
    </mx:Application>
    
  • 用来确定覆盖区域的填充与否

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()" layout="absolute">
    <mx:Script>
    <![CDATA[
    import mx.core.UIComponent;
    
    private var UI:UIComponent = new UIComponent();
    private var UIa:UIComponent = new UIComponent();
    
    public function init():void
    {
    addChild(UI);
    addChild(UIa);
    
    UIa.graphics.beginFill(0xFFFFFF);
    UIa.x = 130;
    UI.graphics.beginFill(0xFFFFFF);
    
    UI.graphics.drawPath(
    Vector.<int>([1,2,2,2,2]),
    Vector.<Number>([66,10, 23,127, 122,50, 10,49, 109,127]),
    GraphicsPathWinding.EVEN_ODD);
    
    UIa.graphics.drawPath(
    Vector.<int>([1,2,2,2,2]),
    Vector.<Number>([66,10, 23,127, 122,50, 10,49, 109,127]),
    GraphicsPathWinding.NON_ZERO);
    }
    
    ]]>
    </mx:Script>
    </mx:Application>
    

    EVEN_ODD:无论如何,都会不填充交替部分(与交替部分相邻的部分将填充)
    NON_ZERO:不填充非“0”区域
    PS:顺时针画出的图形记为+1,逆时针记为-1,在交替部分计算机过,得出是否非0

  • 上周4,在公司请了假,飞奔到北京参加Google Developer Day  2008….

    这次的大主题是云计算,几个分主题包括移动,地图,社区,实现等等。

    其实没有AS相关的讨论。一来是想去感受一下气氛,二来是去听听G是怎么解释云的。哪想到…那人多的啊….

    每个分会场,都有站票,而且站票比坐票还多(包括坐在地上的)…

    Google的地盘,免费的吃喝是少不了的,虽说人多吧,饮料水果的还是蛮充足。但必须要批斗一下的是,午饭实在是太说不过去了。

    我一天都在移动主题的分会场听讲座,Android。

    这个东东吧,至少听上去是不错的。第一场是G的一名叫Jacky Chen(好像是叫这名字….)的GG讲一些Summary。演讲之后的提问环节,有一个朋友问了一个很到位的问题:“Why Android,Not Windows Mobile?”

    E….完全一针见血啊。虽然未来的GPhone会支持Android,未来的像三星之类的厂商会支持Android。但是,现在明显还是WM的天下嘛。G是有影响力的,一句话,就会引来无数狂热的,没头没脑的,我们的追捧,相信几个月内,就会用更多更多更多的傻GG们投入到Android的研发中来。

    但是结果呢?受益的无非是Google。但是结果呢?Google会用什么回报大家?

    G现在是沉默的。

    PS:在第一场的大会主题演讲时,发现一美女,还是独自一人…至少看上去,像是一个研发人员。所以,广大的开发者,不要气馁啊….