{ yeah : 必须哒 } No place to place should record our youth?

1Aug/100

as3右键响应事件–使用js屏蔽flash的右键菜单

Posted by ofeng

JAVASCRIPT:
[cc lang="js"]
/**
*
* Copyright 2007
*
* Paulius Uza
* http://www.uza.lt
*
* Dan Florio
* http://www.polygeek.com
*
* Project website:
* http://code.google.com/p/custom-context-menu/
*
* --
* RightClick for Flash Player.
* Version 0.6.2
*
*/

var RightClick = {
/**
* Constructor
*/

init: function ( ) {
this.FlashObjectID = "customRightClick";
this.FlashContainerID = "flashcontent";
this.Cache = this.FlashObjectID;
if (window.addEventListener ) {
window.addEventListener ( "mousedown", this.onGeckoMouse ( ), true );
} else {
document.getElementById ( this.FlashContainerID ).onmouseup = function ( ) { document.getElementById (RightClick.FlashContainerID ).releaseCapture ( ); }

document.oncontextmenu = function ( ) { if (window.event.srcElement.id == RightClick.FlashObjectID ) { return false; } else { RightClick.Cache = "nan"; } }
document.getElementById ( this.FlashContainerID ).onmousedown = RightClick.onIEMouse;
}
},

/**
* GECKO / WEBKIT event overkill
* @param {Object} eventObject
*/

killEvents: function (eventObject) {
if (eventObject) {
if (eventObject.stopPropagation ) eventObject.stopPropagation ( );
if (eventObject.preventDefault ) eventObject.preventDefault ( );
if (eventObject.preventCapture ) eventObject.preventCapture ( );
if (eventObject.preventBubble ) eventObject.preventBubble ( );
}
},

/**
* GECKO / WEBKIT call right click
* @param {Object} ev
*/
onGeckoMouse: function (ev) {
return function (ev) {
if (ev.button != 0 ) {
RightClick.killEvents (ev);
if (ev.target.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID ) {
RightClick.call ( );
}
RightClick.Cache = ev.target.id;
}
}
},

/**
* IE call right click
* @param {Object} ev
*/
onIEMouse: function ( ) {
if (event.button> 1 ) {
if (window.event.srcElement.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID ) {
RightClick.call ( );
}
document.getElementById (RightClick.FlashContainerID ).setCapture ( );
if (window.event.srcElement.id )
RightClick.Cache = window.event.srcElement.id;
}
},
/**
* Main call to Flash External Interface
*/
call: function ( ) {
document.getElementById ( this.FlashObjectID ).rightClick ( );
}
}
[/cc]

Actionscript:

[cc lang="actionscript3"]
package {
import flash.display.*;
import flash.external.ExternalInterface;

public class RightClick extends Sprite
{
public function RightClick( )
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
var methodName:String = "rightClick";
var method:Function = onRightClick;
ExternalInterface.addCallback (methodName, method);
}

private function onRightClick( ):void {
var mx:int = stage.mouseX;
var my:int = stage.mouseY;
if (my> 0 && my 0 && mx <stage.stageWidth ) {
// YOUR CODE HERE
}
}
}
}
[/cc]

WINDOWS VISTA

* Internet Explorer 7.0.6001 (16549)
* Firefox 2.0.0.6 (with mouse gestures disabled)
* Maxthon 2 (with mouse gestures disabled)
* Safari 3.0.3 (522.15.5)

Windows XP SP2

* Internet Explorer 6
* Internet Explorer 7
* Maxthon 2 (with mouse gestures disabled)
* FireFox 2 (with mouse gestures disabled)
* Safari 3
* Netscape 8

Mac OSX 10.4.10 (Intel)

* Firefox 2
* Safari 3.0.3

参考:

http://www.uza.lt/blog/2007/08/solved-right-click-in-as3/

DEMO:http://www.uza.lt/rightclick/

1Aug/100

谈谈Flex中ArrayCollection的复制(克隆)

Posted by ofeng

在Flex的开发过程中,常常会遇到复制ArrayCollection的情况。以前只是从网上找个方法拿来就用,也没有具体的搞清楚所以然来。今天有时间,研究了一下,总结如下:

Flex中的复制同java一样,也分为深复制和浅复制。

下面总结一下ArrayCollection的浅复制,共有4种方法:

1、var newArray:ListCollectionView=new ListCollectionView(ListCollectionView(oldArray).list);

2、var newArray:ArrayCollection=new ArrayCollection(oldArray.source);

3、var newArray:ArrayCollection=new ArrayCollection(oldArray.source.slice());

4、var newArray:ArrayCollection=new ArrayCollection(oldArray.toArray());

以上方法中,第一种方法由于不是创建的独立的ArrayCollection对象,所以不推荐使用。第二、三、四种方法相似,可以参考使用。

有的时候,我们也会用到深复制,方法如下:

var newArray:ArrayCollection=ArrayCollection(this.clone(oldArray));

this.clone()方法定义如下:

function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}

下面是我测试以上程序的Flex程序代码,大家可以参考:

xml version="1.0" encoding="utf-8" ?>
< mx:Application xmlns:mx ="http://www.adobe.com/2006/mxml" creationComplete ="initApp()" layout ="absolute" >
< mx:Script >

<!-- mx:Script >
< mx:Button label ="第一种浅复制方法" click ="test1()" x ="61" y ="36" />
< mx:Button label ="第二种浅复制方法" click ="test2()" y ="57" x ="61" width ="114" />
< mx:Button label ="第三种浅复制方法" click ="test3()" y ="78" x ="61" width ="114" />
< mx:Button label ="第四种浅复制方法" click ="test4()" y ="98" x ="61" width ="114" />

< mx:Button label ="深复制方法" click ="test5()" y ="147" x ="61" />
<!-- mx:Application >
1Aug/100

Flex中的事件机制

Posted by ofeng

一. 事件简介
事件可以由外设触发, 比如:键盘,鼠标, 也可能是外部输入, 比如:web service的返回.
事件还能由组件的外观和生命周期发生变化时触发, 比如:组件的创建或者改变大小.
所有用户与应用交互都会产生事件.用户没有直接与应用交互也可能产生事件, 比如:数据装载完毕.
你可以在程序中使用事件监听器监听这些事件. 事件监听器是函数方法用于响应指定的事件. 有时也称之为事件处理器.
Flex的事件模型基于DOM3事件模型.
组件产生派发事件并消费(监听)其他事件.如果一个对象想要了解其他对象事件的信息, 可以注册一个监听器.
当事件发生时,对象派发此事件到所有注册过的监听器中.
组件有Flex提供的内建事件. 也可以使用派发-监听模型定义自己的事件监听器, 并指定监听器监听何种事件.
二. 事件流简介
当一个事件被派发出来时, 事件对象从根节点开始自上而下开始扫描display list, 一直到目标对象, 检查每个节点是否有相应的监听器.
目标对象指的是display list中产生事件的对象. 比如:

如何此时 resize了VBox, 则会从根(Application)开始, 下来检查Panel, HBox, 直到目标对象-产生resize事件的VBox为止.

三. 事件的派发
Flex中可以通过dispatchEvent()方法手工派发事件, 所有UIComponent的子类都可以调用此方法.
语法:
objectInstance.dispatchEvent(new Event("event_type"):Boolean
参数event_type是Event对象的type属性. 函数的返回值总是True.
可以使用此方法派发任意事件, 而不仅仅是用户自定义事件, 比如: 可以派发一个Button的Click事件.
var result:Boolean = buttonInstance.dispatchEvent(new Event(MouseEvent.CLICK));

在Flex应用中不是必须对新派发的事件进行处理, 如果触发了一个事件, 而没有对应的Listener时,Flex忽略此事件.
如果想给Event对象添加新属性, 就必须继承Event类,然后定义新属性

四.事件的传播:
事件触发后, Flex有3个检测事件监听器的阶段, 3个阶段的发生的顺序如下:
1. 捕获
2. 目标
3. 上浮
在任意一个阶段, 节点们都有机会操作事件. 比如: 用户点击了一个在VBox中的Button,
在捕获阶段, Flex检查Application对象(根节点)和VBox是否有监听器处理此事件. Flex然后在目标阶段触发按钮的监听器.
在上浮阶段, VBox和应用以与捕获阶段相反的顺序再次获得机会处理事件.
在Actionscript3.0中,你可以在任意目标节点上注册事件监听器. 但是部分事件会被直接传给目标节点,比如Socket类.
捕获阶段的节点顺序是从父节点到子节点的, 而上浮阶段刚好相反.
捕获事件缺省是关闭的,也就是说如果要捕获事件, 必须显式指定在捕获阶段进行处理.
每一个Event都有target和currentTarget属性, 帮助跟踪事件传播的过程.

捕获阶段:
在捕获阶段,Flex在显示列表中检查事件的祖先是否注册了事件的监听器. Flex从根节点开始顺序而下.
大多数情况中, 根节点是Application对象. 同时, Flex改变事件的currentTarget值.
缺省情况下, 在此阶段,没有容器监听事件. use_capture参数的值是False,在此阶段添加监听的唯一方法是在调用add_listener时,
传入一个为True值的use_capture参数, 比如:
myAccordion.addEventListener(MouseEvent.MOUSE_DOWN, customLogEvent, true);
如果是在Mxml中添加监听, Flex设置此参数为False, 没有办法进行修改.
如果设置了use_capture为True, 那么事件将不会上浮. 如果既想捕获又想上浮就必须调用 addEventListener两次.
一次use_capture参数为true, 一次为false;
捕获很少使用, 上浮的使用更为普遍.

目标阶段:
在目标阶段, Flex激发事件的监听程序, 不检查其他的节点.

上浮阶段:
事件只在bubbles属性为True时才进行上浮. 可以上浮的事件包括: change, click, doubleClick, keyDown, keyUp, mouseDown, mouseUp.
在上浮阶段, Flex改变事件的currentTarget属性, 而target属性是初始派发事件的对象.

查询事件阶段:
使用事件的eventPhase可以获得事件当前的阶段,
1: CAPTURE_PHASE
2: AT_TARGET
3: BUBBLING_PHASE
示例: private function determineState(event:MouseEvent):Void { Debug.trace(event.eventPhase + ":" + event.currentTarget.id); }

停止传播:
使用下面两个函数停止事件的传播:
stopPropagation()
stopImmediatePropagation()

件是一个非常有用的功能,通常用于信息传递交互大大提高程序编写的灵活性。在高级语言中都会集成这方面特性;Flex也不例外几乎所有控件中都集成了大量的事件,如果Button的Click事件等。但实际应用中控件自有的事件是不能满真实需要的,特别在自己编写自定义控件时,自定义控件内部信息的改变如何及时通知所在的容器变得很更要;这个时候自定义事件就起到它的作用。

在Flex中定义事件有两中情况,分别是ActionScript和MXML中定义。

在ActionScript中定义:

CODE:
[cc lang="actionscript3"]
[Event(name="myEnableEvent", type="flash.events.Event")]

public class MyComponent extends UIComponent

{

...

}
[/cc]

在MXML中定义:

CODE:
[cc lang="actionscript3"]

[Event(name="DataChange", type="DataChangeEvent")]

[/cc]

DataChangeEvent事件参数的定义:

CODE:
[cc lang="actionscript3"]
import flash.events.Event;
public class DataChangeEvent extends flash.events.Event
{
public function DataChangeEvent()
{
super("DataChange");
}
public var Data:Object;
}
[/cc]

在自定义控件中定义和触发事件:

CODE:
[cc lang="actionscript3"]

[Event(name="DataChange", type="DataChangeEvent")]

function Change():void

{

this.dispatchEvent(new DataChangeEvent());

}

[/cc]

容器接收相关自定义控件事件:

CODE:
[cc lang="actionscript3"]

import mx.controls.Alert;

function onChange(e:DataChangeEvent)

{

}

[/cc]

其实自定义事件的现实也很简单,但起着非常重要的作用;正是因为有了事件的机制,使得大部分重复的功能抽取到自定义控件中,从而达到一个很高的代码重用性。

Tagged as: , , No Comments