- 在Application中添加非UIComponent组件
譬如以下代码就会报错:
private function init():void { var sp:Sprite = new Sprite(); addChild(sp);}
TypeError: Error #1034: 强制转换类型失败:无法将 flash.display::Sprite@156b7b1 转换为 mx.core.IUIComponent。这是因为Application的addChild方法并非完全继承自DisplayObjectContainer,
Application→LayoutContainer→Container →UIComponent→FlexSprite→Sprite
→DisplayObjectContainer
而是在Container那里被重写了:
public override function addChild(child:DisplayObject):DisplayObject
虽然参数child的类型是DisplayObject,但是它必须实现IUIComponent接口(所有Flex组件都实现了这一接口),才能添加。
如果要在Application里添加Sprite,可以先把它装进一个UIComponent,然后再添加这个UIComponent:
官方的说法:
* <p><b>Note: </b>While the <code>child</code> argument to the method
* is specified as of type DisplayObject, the argument must implement
* the IUIComponent interface to be added as a child of a container.
* All Flex components implement this interface.</p>
例子:
import mx.core.UIComponent;private function init():void {
var sp:Sprite = new Sprite();
var uc:UIComponent = new UIComponent();
uc.addChild(sp); addChild(uc);
}
- 为何要重载Event的clone方法
一般情况下是没有问题的,但是以下情景下会出问题
举个例子,老师点名,学生应答,如果学生应答以后,课代表记录已到
首先teacher.addEventListener(CallEvent.CALL, student.receive);
在teacher上添加CallEvent,
teacher.call("name1" );
当teacher发出call事件的时候,study会应答,
public function receive(e:CallEvent):void
{
if (e.name == this.name)
{
trace(name + " is here");
this.dispatchEvent(e);
}
}
如果做到这里就结束完全没有必要重载clone方法,但是如果后续课代表要监听学生的receive事件记录的时候就必须要重载
Event的clone方法,否则的话,student.addEventListener(CallEvent.CALL, add);在add中就会出现逻辑问题
private function add(e:CallEvent):void
{
trace(e.name);
col.push(e.name);
} - Data binding will not be able to detect assignments to “yourtype”
flex在编译mxml文件的时候,会先编译非<mx:script>的那一部分,在这个时候找不到yourType这个变量就会报个worning,如果你在yourType变量上有[Bindable]标记,那么就会先跳过编译,等程序运行时在取。在as文件中的[Bindable]是绑定那个类,你在<mxml>中的那个[Bindable]是绑定一个变量。
为什么要在as类中也要写呢?因为,在mxml中你只绑定了这个类,这个类不是动态的(dynamic)的,所以,肯定会有worning标记。
- 关于embedding资源
使用Embed标签嵌入资源,比如图片等,则资源会被编译到应用程序中的SWF文件中。如果没有则不会。
Embed资源的优势是,它存在于SWF文件中,其访问速度比从其它地方加载要快很多
Embed资源的缺点是,你的SWF文件大于如果你在运行时加载的资源的情况。
- FlashBuilder中英文切换
如果你想使用英文版本的Flash Builder 4 Beta,你只需要将Flash Builder 4 Beta 安装目录下的FlashBuilder.ini文件打开,将ZH_C改为EN,重启Flash Builder即可。
MACOS下FlashBuilder.ini文件比较隐蔽,在Applications/Adobe Flash Builder Beta/FlashBuilder.app/Contents/MacOS/路径下,记得用文件浏览方式打开.app文件
- 如何让自定义的属性可以被其它组件绑定
1、如果是public的属性,可以直接加一个[Bindable]标签,如下所示
public var maxFontSize:Number = 15;
2、如果是get/set方法的属性,需要以下两步
(1)在get方法上加一个Bindable标签,如下所示
[Bindable("eventChanged")]
public function get maxFontSize():Number {
return _maxFontSize;
}
(2)在set方法中dispatchEvent(new Event("eventChanged"));
- Flex中对话窗体的使用
//WindowPanel为任一组件
var login:WindowPanel=WindowPanel(PopUpManager.createPopUp(this, WindowPanel, true));
PopUpManager.centerPopUp(login);
this.stage.addEventListener(KeyboardEvent.KEY_DOWN, hideWindow);
private function hideWindow(e:KeyboardEvent):void
{
if (e.keyCode=Keyboard.ESCAPE)
{
PopUpManager.removePopUp(login);
}
}
- 为何MouseEvent.DOUBLE_CLICK不起作用
doubleClickEnabled="true"
- Mask
非Swing中的GlassPanel的概念,被遮罩的显示对象显示在用作遮罩的显示对象的全部不透明区域之内,所以如果遮罩的设置了alpha不为1,则,被遮罩对象则会隐藏不显示。
- TextField,Alpha设置
设置parent .blendMode = BlendMode.LAYER;
- 弹出任意面板
private function showPopupPanel():void {
PopUpManager.addPopUp(panel, this, false);
panel.x = 300;//global
panel.y = 300;
panel.addEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, hidePopup);
panel.addEventListener(FlexMouseEvent.MOUSE_WHEEL_OUTSIDE, hidePopup);
panel.addEventListener(SandboxMouseEvent.MOUSE_DOWN_SOMEWHERE, hidePopup);
panel.addEventListener(SandboxMouseEvent.MOUSE_WHEEL_SOMEWHERE, hidePopup);
}private function hidePopup(e:Event):void {
PopUpManager.removePopUp(panel);
}
- 如何在一个带滚动条的面板上固定一个信息/配置面板
加一个面板到其父组件,然后设置面板的top/bottom/right/left属性即可
- IFocusManagerComponent
接口提供方法和属性,使得组件具有获得焦点的功能。 组件必须实现此接口才能从 FocusManager 获得焦点。 UIComponent 类提供此接口的基实现,但不是完全实现,因为并非所有 UIComponent 对象都获得焦点。 从 UIComponent 类派生的组件必须实现此接口才能获得焦点。 若要启用焦点,请将
implements IFocusManagerComponent
语句添加到由 UIComponent 类派生的组件的类定义中。
- 监听TextInput的回车事件
_textKeywords.addEventListener(FlexEvent.ENTER, onTextKeyWordsEnterPressed);
- 修改书上打开关闭图标
tree.setStyle('disclosureOpenIcon',iconTriangleOpen); tree.setStyle('disclosureClosedIcon',iconTriangleClose);