as3右键响应事件–使用js屏蔽flash的右键菜单
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/
谈谈Flex中ArrayCollection的复制(克隆)
在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程序代码,大家可以参考:
Flex中的事件机制
|
一. 事件简介 如何此时 resize了VBox, 则会从根(Application)开始, 下来检查Panel, HBox, 直到目标对象-产生resize事件的VBox为止. 三. 事件的派发 在Flex应用中不是必须对新派发的事件进行处理, 如果触发了一个事件, 而没有对应的Listener时,Flex忽略此事件. 四.事件的传播: 捕获阶段: 目标阶段: 上浮阶段: 查询事件阶段: 停止传播: |
件是一个非常有用的功能,通常用于信息传递交互大大提高程序编写的灵活性。在高级语言中都会集成这方面特性;Flex也不例外几乎所有控件中都集成了大量的事件,如果Button的Click事件等。但实际应用中控件自有的事件是不能满真实需要的,特别在自己编写自定义控件时,自定义控件内部信息的改变如何及时通知所在的容器变得很更要;这个时候自定义事件就起到它的作用。
在Flex中定义事件有两中情况,分别是ActionScript和MXML中定义。
在ActionScript中定义:
[Event(name="myEnableEvent", type="flash.events.Event")]
public class MyComponent extends UIComponent
{
...
}
[/cc]
在MXML中定义:
[Event(name="DataChange", type="DataChangeEvent")]
[/cc]
DataChangeEvent事件参数的定义:
import flash.events.Event;
public class DataChangeEvent extends flash.events.Event
{
public function DataChangeEvent()
{
super("DataChange");
}
public var Data:Object;
}
[/cc]
在自定义控件中定义和触发事件:
[Event(name="DataChange", type="DataChangeEvent")]
function Change():void
{
this.dispatchEvent(new DataChangeEvent());
}
[/cc]
容器接收相关自定义控件事件:
import mx.controls.Alert;
function onChange(e:DataChangeEvent)
{
}
[/cc]
其实自定义事件的现实也很简单,但起着非常重要的作用;正是因为有了事件的机制,使得大部分重复的功能抽取到自定义控件中,从而达到一个很高的代码重用性。