|
http://bbs.9ria.com/viewthread.php?tid=83888&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000
该死的浏览器 火狐应该被*毙。。
透明模式下 火狐和谷歌浏览器中的flash无法使用滚轮事件。我这边的项目又需要有DIV浮在flash上面 所以 只能走JS滚轮了
思路是 建立一个数组存放需要使用滚轮的显示对象。注册鼠标OVER 和OUT事件来 处理焦点问题(FLASH 不好找焦点在谁手上,只有自己这样写了。 当然这样也存在着 两个需要滚轮的对象不能是父子关系,需要时平级关系) 当获取JS的滚轮事件 传递到该类,通知该显示对象指定的方法 告诉它 你该滚了。 另外在全屏模式 JS是使用不了的。所以要判断是否是全屏 来切换使用 滚轮事件(用JS还是用FLASH自己的)
先是JS部分
function GetFlash() { return document.getElementById("Flash"); } if(!(document.attachEvent)) { window.addEventListener("DOMMouseScroll", handleWheel, false); } window.onmousewheel = document.onmousewheel = handleWheel; function handleWheel(e) { if (GetFlash()) { var t1 if(e.wheelDelta){ t1 = Number(e.wheelDelta)/40; }else if(e.detail){ t1 = Number(e.detail) } GetFlash().handleWheel(t1); } }
再是滚轮类
package Wheel{ import flash.display.DisplayObjectContainer; import flash.display.InteractiveObject; import flash.display.Stage; import flash.events.FocusEvent; import flash.events.FullScreenEvent; import flash.events.MouseEvent; import flash.external.ExternalInterface; //JS滚轮调用 kinghost80 public class WheelTool { public var Arr:Array =new Array(); //需要被控制的数组 包含 一个现实对象 和一个方法 private static var _instance:WheelTool = new WheelTool(); public static var JSWheelBoo:Boolean = false; public var tempArr:Array; public var stage:Stage; //全屏模式下调用JS无效 public function WheelTool() { if (_instance) { throw new Error("只能用getInstance()来获取实例"); } } //初始化把舞台对象搞进来并决定是否使用JS滚轮 TRUE为使用JS public function Init(s:Stage , boo:Boolean= false):void { WheelTool.JSWheelBoo = boo; stage =s; ExternalInterface.addCallback("handleWheel", JSHandleWheel); stage.addEventListener(MouseEvent.MOUSE_WHEEL , FlashHandleWheel); } public static function getInstance():WheelTool { return _instance; } //加入显示对象和滚轮移动时候调用的方法 public function Add(dis:DisplayObjectContainer , fun:Function):void { Arr.push(new Array(dis ,fun)); dis.addEventListener(MouseEvent.MOUSE_OVER , mouseoverfun); dis.addEventListener(MouseEvent.MOUSE_OUT , mouseoutfun); } public function Del(dis:DisplayObjectContainer = null):void { if(tempArr!= null) { if(dis == tempArr[0]) { tempArr = null; } } for( var i:int = Arr.length-1; i>=0 ; i--) { if(Arr[0] == dis) { Arr.splice(i,1); } } } public function mouseoverfun(evt:MouseEvent):void { for each (var g:Array in Arr) { if(g[0]==evt.currentTarget) { tempArr = g; } } } public function mouseoutfun(evt:MouseEvent):void { for each (var g:Array in Arr) { if(g[0]==evt.currentTarget) { tempArr = null; } } } //js滚轮事件 public function JSHandleWheel(n:Number): void { if(!WheelTool.JSWheelBoo) { return; } if(tempArr != null) { tempArr[1](n); } } //flash滚轮事件 public function FlashHandleWheel(evt:MouseEvent): void { if(WheelTool.JSWheelBoo) { if(stage.displayState != "fullScreen") { return; } } if(tempArr != null) { tempArr[1](evt.delta); } } }}
最后是调用方法
初始化部分
var k:WheelTool = WheelTool.getInstance();
k.Init(this.stage,true);
调用部分
public var JSW:WheelTool = WheelTool.getInstance(); //外挂滚轮
JSW.Add(this ,MouseWheelEventFun);
//滚轮事件
public function MouseWheelEventFun(n:Number):void
{
trace(n)
}
抛砖引玉 欢迎大家讨论 看看有没有更好的办法 解决 滚轮问题 |
|