About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Jul

    26

    Flex 中状态与状态组的使用

    • 0 Comments
    • Flash Platform

    Flex 中状态(State)与状态组(stateGroups)的使用区别:

     状态是一个特定的视图状态,通过 currentState 属性可以设定一个应用或组件的状态,从而调整视图的效果。

     状态组是为了减少切换状态时所需要的一种 MXML 语法(为了减少代码量)。

    当更改状态组时,会使用这样的语法:属性或事件.状态组 = "状态组名称",但绝对不会使用 currentState = "状态组名称"这样的语法。 

    在使用 includeIn 和 excludeFrom 都会相应的销毁和创建目标组件,但也可以通过“创建 / 销毁策略”来改变这种情况。  

    1、在组件中设定 itemCreationPolicy 属性值,可以定义创建策略。该属性值有2个字符串值,分别是:deferred、immediate。

     deferred:则意味着组件所在的state第一次获取切换时创建(默认值)。

     immediate:则意味着组件在应用启动时创建(但如果当前状态不属于当前状态组,creationComplete 事件不会发生——该组件在第一次被渲染绘制时,才会发生该事件。该事件发生之前,组件对象的引用是存在的)。

    2、在组件中设定 itemDestructionPolicy 属性值,可以定义 销毁策略。该属性值有2个字符串值,分别是: never 、 auto 。

     never: 组件一旦创建就不会被自动销毁 (默认值)。

     auto:当离开包含该组件的状态时,组件将被自动销毁。

    但创建与销毁策略机制在一定情况下也可以使用组件的 visible 属性与 includeInLayout 属性来代替使用,但代码量相对来说会比较多一些。

    Jul

    26

    Flex 中使用 HTTPService 对象

    • 0 Comments
    • Flash Platform

     如果要在 Flex 中使用 HTTPService 对象,必须对域的根目录中放置一个跨域策略文件。

    Jul

    25

    向 Halo 容器添加子组件时,子组件必须扩展 UIComponent 。Flex 4 中的基本组件和其它没有通过扩展 UIComponent 的组件可以先包装到扩展了 UIComponent 的 Group 中再使用。

    Jul

    22

    1、如果需要使用 MXML 语言,则自定义的列表类组件需扩展自 ListBase 类。支持 dataProvider, labelField, labelFunction,requiresSelection, selectedIndex, selectedItem, 和 useVirtualLayout 这些标签。

    2、如果只扩展 SkinnableDataContainer 类,那么仍然可以使用上面这些属性,但不能再使用 MXML 语法。

    3、Spark 命名空间的列表类组件中,包括自定义列表类组件中,如果使用 MXML 语法直接添加集合类数据(实现了 ICollectionView  类的数据)至控件,默认会包装在 dataProvider 中(也就是可以省略 <s:dataProvider/> 标签)。

    4、自定义列表类组件时,需要将皮肤和状态抽象为一个单独的类;从外部获得数据;项渲染器抽象为单独的类。

    5、labelFunction 以循环遍历的方式处理所有标签字段,如果一个列表类对象(包括自定义列表类对象)使用了 labelFunction 并不断的更新数据,这将可能会引发性能问题。

    Jul

    18

    Flex 格式化数据

    • 0 Comments
    • Flash Platform

     格式化相关的类只适用于原始的、未经格式的数据。如果针对用户可以编辑的文本域使用格式化相关的类,必须先删除输入数据中已经包含的所有格式化字符。

    Jul

    15

     如果需要控制嵌入的整个 SWF 资源文件方法如下:

    //方法一:[Embed(source="test.swf" , mimeType="application/octet-stream")]
    package {
     import flash.display.Loader;
     import flash.display.LoaderInfo;
     import flash.display.MovieClip;
     import flash.events.Event;
     public class Test extends MovieClip {
      [Embed(source="test.swf" , mimeType="application/octet-stream")]
      private var SWFBytes:Class;
      private var _loader:Loader;
      public function Test() {
       _loader = new Loader();
       _loader.loadBytes(new SWFBytes());
       _loader.contentLoaderInfo.addEventListener(Event.INIT,_listener);
       function _listener(e:Event):void {
        var _mc:MovieClip = _loader.content as MovieClip;
        _mc.gotoAndStop(2);
        addChild(_mc);
       }   
      }  
     } 
    }


    //方法二: [Embed(source="test.swf")]
    package {
     import flash.display.Loader;
     import flash.display.LoaderInfo;
     import flash.display.MovieClip;
     import flash.events.Event;
     public class Test extends MovieClip {
      [Embed(source="test.swf")]
      private var Swf:Class;
      private var _mc:MovieClip;
      public function Test() {
       _mc = new Swf();
       addChild(_mc);
       var _loaderInfo:LoaderInfo = (_mc.getChildAt(0) as Loader).contentLoaderInfo;
       _loaderInfo.addEventListener(Event.INIT,_listener);
       function _listener(e:Event):void {
        MovieClip(_loaderInfo.content).gotoAndStop(2);
       }
      }
     }
    }

    如果需要控制嵌入的 SWF 资源文件中单个的元件或类,需要使用到 ApplicationDomain 类的实例方法 getDefinition() ,详请参考《[Embed] 元数据标签嵌入高版本的 SWF 资源文件时的一些备忘知识

    Jul

    13

    Loader 对象在加载文件时侦听 init & complete 事件时不需要对象在显示列表上,但在使用 SWFLoader & Image 组件时发现,如果这两类组件的实例不在显示列表上的话就不会执行  init & complete 事件侦听器,也就是没有调度这两个事件,但在 API 手册上并没有注明这两个事件在这两种组件中使用时的条件(不知是否与特定版本的 SDK 或特定的主题有关,本人使用的是 FLEX  最新版本 4.6 的 Halo 主题样式组件)。

    如果在 Flex 中需要使用这两种类型的组件,并且需要侦听这两种事件但又执行,可以通过将对象添加到显示列表来解决这个问题。

    More...

    Jul

    10

    以下内容出自《Foundation Actionscript.3.0 Animation》:

    //移除出界对象:
    if (sprite.x - sprite.width / 2 > right ||
    sprite.x + sprite.width / 2 < left ||
    sprite.y - sprite.height / 2 > bottom ||
    sprite.y + sprite.height / 2 < top) {
     // 移除影片的代码
    }


    //重置出界对象:
    if (sprite.x - sprite.width / 2 > right ||
    sprite.x + sprite.width / 2 < left ||
    sprite.y - sprite.height / 2 > bottom ||
    sprite.y + sprite.height / 2 < top) {
     // 重置影片的位置和速度
    }


    //屏幕环绕出界对象:
    if (sprite.x - sprite.width / 2 > right) {
     sprite.x = left - sprite.width / 2;
    } else if (sprite.x + sprite.width / 2 < left) {
     sprite.x = right + sprite.width / 2;
    }
    if (sprite.y - sprite.height / 2 > bottom) {
     sprite.y = top - sprite.height / 2;
    } else if (sprite.y + sprite.height / 2 < top) {
     sprite.y = bottom + sprite.height / 2;
    }


    //摩擦力应用(正确方法):
    speed = Math.sqrt(vx * vx + vy * vy);
    angle = Math.atan2(vy, vx);
    if (speed > friction) {
     speed -= friction;
    } else {
     speed = 0;
    }
    vx = Math.cos(angle) * speed;
    vy = Math.sin(angle) * speed;


    //摩擦力应用(简便方法):
    vx *= friction;
    vy *= friction;

    Jul

    10

    碰撞检测反弹小心“陷井”

    • 0 Comments
    • Flash Platform

    碰撞检测反弹从原理或算法上来说也许很简单,但需小心“陷井”。在反弹时仅仅改变速度的方向是不够的,还需要重置物体对象的位置(重置对象的位置会让动画与真实世界的物理运动有一点差别,但在 Flash 中足够“逼真”了)。因为它的下一帧它仍可能处于“碰撞”状态,没有完全与被撞物体分离。这会使用物体的速度不断的改变方向,处于一种“颤抖”状态。

    Jul

    10

    以下内容出自《Foundation Actionscript.3.0 Animation》:

    //角速度转换为 x,y 速度向量:
    vx = speed * Math.cos(angle);
    vy = speed * Math.sin(angle);

    //角加速度(作用于物体上的 force )转换为 x,y 加速度:
    ax = force * Math.cos(angle);
    ay = force * Math.sin(angle);

    //将加速度加入速度向量:
    vx += ax;
    vy += ay;

    //将速度向量加入坐标:
    movieclip._x += vx;
    sprite.y += vy;