`
showerliang
  • 浏览: 716 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Flex设置flash在html中所遇到的种种问题

 
阅读更多

第一次写,请见谅!

背景:

使用Flex做开发,碰到一些需求,要求能够在Flex开发的swf中嵌入其他html页面.

或者将swf嵌入到其他页面.

解决思路:

在swf嵌入其他页面:

利用Iframe来进行嵌入,或本页弹框,或本页框架嵌入 

网上有相关Flex开源的IFrame组件可供使用.名称叫 flex-iframe

在其他页面嵌入swf:

可以使用object 或者embed进行嵌入.也可以使用iframe引用一个object和embed包装的html页面

问题1描述: wmode 模式的选用 ,导致鼠标滚轮无效

wmode的三个模式分别为:window/Transparent/opaque

window:窗口模式,在没有指定wmode的时候,flash默认是以这种方式创建的。在这种模式下,flash拥有自己的窗口句柄,从而相对独立于浏览器的页面表现,独立的进行表现和渲染,所以窗口模式是相对其他模式来说效率最高的一种。同时也是因为它独立于浏览器的HTML渲染表面,所以当html的表现层和flash的表现层重合的时候,flash总是会遮住位置与他重合的所有html层。eg:你要做一个模态的提示框,想让灰色覆盖整个页面,但在有flash的情况,flash会不管你html中z-index的设置而表现在上层。 于是,就引出了第二种模式。

transparent :透明模式,这种模式类似于把flash放到html层结构里,可以通过z-index来进行层表现的传递和高度。在这种模式下flash会让可以透明的html层都以透明的方式展示在自己之上。这种对动画的性能表现的非常差,而且在9.0.115之前的flash player版本设置wmode=”transparent”会导致全屏模式失效。

Opaque:非透明模式,整个是相对于transparent方式来说的,它使flash隐藏html层上所有位于它后面的所有内容。

 

除了window模式外其他两个模式flash都没有自己的窗口句柄,表现力上会差很多.抛开表现上的差距,当非window模式下时,在Firefox/chrome浏览器下会发生事件滚轮无效的问题.ie9以上没有该问题,那么解决该问题的方法是:

通过js监听浏览器的鼠标滚轮事件,通过js和flash的function调用来实现对浏览器滚轮的实现.

具体做法如下:

 

if(!(document.all)) {
	   
	   if (document.addEventListener) {
	       window.addEventListener("DOMMouseScroll", onMouseWheelHandler, false);
	   }
	   window.onmousewheel = document.onmousewheel = this.onMouseWheelHandler; //Opera/Chrome 
	}
	function getFlashMovieObject(movieName){
		if (window.document[movieName]) {
			return window.document[movieName];
		}
		if (navigator.appName.indexOf("Microsoft Internet") == -1) {
			if (document.embeds && document.embeds[movieName])
				return document.embeds[movieName];
		}else {
			return document.getElementById(movieName);
		}
	}
	function onMouseWheelHandler(e){
	   var o = {x: e.screenX, y: e.screenY, delta: e.wheelDelta ? e.wheelDelta : -e.detail, ctrlKey: e.ctrlKey, altKey: e.altKey, shiftKey: e.shiftKey};
	   var vflash = getFlashMovieObject("${application}");
	   vflash.handleWheel(o);
	  
	};

 通过添加该段js脚本可以使得js可以调用flash为js注册的handleWheel方法.

 

在flex中我们需要添加该注册方法,在swf构建完毕后,添加如下内容

 

ExternalInterface.addCallback( "handleWheel" , handleWheel);  

 实现handleWheel方法

public function handleWheel(event:Object):void
			{
				var obj:InteractiveObject = null;
				var objects:Array = this.getObjectsUnderPoint(new Point(event.x, event.y));
				for (var i:int = objects.length - 1; i >= 0; i--) {
					if (objects[i] is InteractiveObject) {
						obj = objects[i] as InteractiveObject;
						break;
					} else {
						if (objects[i] is Shape && (objects[i] as Shape).parent) {
							obj = (objects[i] as Shape).parent;
							break;
						}
					}
				}
				
				if (obj) {
				var mEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL, true, false, event.x, event.y, obj, event.ctrlKey, event.altKey, event.shiftKey,
							false, Number(event.delta) >0 ? 1:-1);
						obj.dispatchEvent(mEvent);

	
				}
			}

 

 

就可以实现在非window模式下 FF/Chrome 滚轮事件的响应了

问题2描述: wmode 模式的选用 ,导致鼠标滚轮无效-FireFox特殊处理

进行问题1的解决方法后,会发现在FireFox下仍然无效,解决方法是在flex中注册js调用方法前加入:

 

Security.allowDomain("*");
				Security.allowInsecureDomain("*"); 
 同意FireFox的js可以调用访问该域下swf的方法.

 

问题3描述: wmode 模式的选用 ,导致ComboBox无法打开使用的处理方式

由于鼠标的滚轮事件会通过js来传递给ComboBox,原combobox的鼠标监听事件无法使用,会导致在combobox打开的状态下,会认为js传来的事件是combobox的外部事件,那么combobox会自动关闭listbase.

解决方法,自己动手写一个combobox,将combbox的listbase打开关闭状态记录下来.当在接到外部js的滚轮事件时 && 并且 combobox的listbase处理打开状态,那么手动处理combobox的滚动.

代码如下:

 

package com.loyo.ui
{
	import flash.utils.Dictionary;
	
	import mx.controls.ComboBox;
	import mx.events.DropdownEvent;
	
	public class SelfComboBox extends ComboBox
	{
		public static var selfComboBoxNum:int = 0;
		public static var selfComboBoxDict:Dictionary = new Dictionary();
		public static function getSCombobox(id:String):SelfComboBox{
			return selfComboBoxDict[id];
		}
		public static function setSelfComboBox(id:String,scombobox:SelfComboBox):void{
			selfComboBoxDict[id] = scombobox;
		}
		
		public var isOpen:Boolean = false;
		
		public function SelfComboBox()
		{
			super();
			this.id = "scombobox_"+selfComboBoxNum;
			selfComboBoxNum++;
			setSelfComboBox(this.id,this);
			addEventListener(DropdownEvent.OPEN,onDropdownOpen);
			addEventListener(DropdownEvent.CLOSE,onDropdownClose);
		}
		
		public function onDropdownOpen(event:DropdownEvent):void{
			trace(" SelfComboBox isOpen :  true" );
			this.isOpen = true;
			
		}
		
		public function onDropdownClose(event:DropdownEvent):void{
			trace(" SelfComboBox isOpen :  false" );
			this.isOpen = false;
		}
		
		public function doMouseWheelByJS(delta:Number):void{
			if(isOpen){
				if(delta > 0){
					if(dropdown.selectedIndex > 0){
						dropdown.selectedIndex--;
					}
				}else{
					dropdown.selectedIndex++;
				}
				dropdown.scrollToIndex(dropdown.selectedIndex);
			}
			
		}
		
	}
}
 

 

----待续.. 有急事

问题5描述: wmode 模式的选用 ,IFrame嵌入swf包装页面html时,如何解决Iframe的滚轮不影响主页面

 

 

分享到:
评论

相关推荐

    flex iframe 支持在flash中嵌套入html jsp asp php等

    flex iframe 支持在flash中嵌套入html jsp asp php等flex iframe 支持在flash中嵌套入html jsp asp php等flex iframe 支持在flash中嵌套入html jsp asp php等flex iframe 支持在flash中嵌套入html jsp asp php等flex...

    Flex与Flash相互调用

    首先,在Flex项目中引入`mx.controls.SWFLoader`库,然后创建一个`SWFLoader`实例,设置其`source`属性为Flash SWF文件的URL或本地路径。例如: ```xml <![CDATA[ private function loadFlash():void { flash...

    flex与flash cs 交互

    Flex和Flash CS交互是开发富互联网应用程序...在项目中,`testAS3.fla`可能是包含AS3代码和交互逻辑的Flash源文件,`flexFlash.mxml`是Flex项目的主文件,而`testAS3.swf`是编译后的SWF文件,它将与Flex应用进行交互。

    flex&flash相互调用

    - Flash内容在HTML页面中嵌入后,需要正确设置SWFObject参数,以便Flex可以正确识别和调用。 4. **源码分析**: 通常,Flex项目中的源码会包含ActionScript代码,用于处理ExternalInterface的调用。在Flash项目中...

    flex与flash的交互

    在IT行业中,Flex和Flash是两种非常重要的技术,它们在创建富互联网应用程序(RIA)时起着关键作用。本文将深入探讨Flex与Flash之间的交互,以及如何利用它们来构建动态、交互性强的Web应用程序。 Flex是由Adobe...

    Flex中利用IFrame解决嵌入HTML时Flex组件被遮挡和IFrame被隐藏的问题

    在Flex中,可以为每个组件设置`includeInLayout`属性和`zIndex`属性来控制它们在堆叠顺序中的位置。确保菜单组件的`zIndex`值高于IFrame,使其显示在IFrame之上。 2. **IFrame被隐藏**:这通常是因为IFrame的CSS...

    flex 卸载flash 安装编译版10flash

    因此,对于开发者而言,尤其是在使用Flex进行开发时,可能需要卸载旧版本的Flash Player以避免冲突或兼容性问题。 卸载Flash Player的步骤如下: 1. 打开操作系统中的“控制面板”(Windows)或“系统偏好设置”...

    flex 与 flash 交互

    Flex和Flash是Adobe开发的两种相关但不同的技术,它们在Web开发中扮演着重要的角色,尤其是在富互联网应用程序(RIA)的构建中。本篇文章将深入探讨Flex与Flash之间的交互,以及如何实现它们之间的相互调用。 Flex...

    应用flash制作flex样式

    1. **设计阶段**:在Flash中,你可以使用矢量绘图工具绘制所需的组件皮肤。这包括按钮、面板、滑块等。确保每个元素都是单独的图层,以便于管理和导出。 2. **导出图形**:完成设计后,将每个组件皮肤导出为SWF或...

    【原创】flex控制flash元件

    博主可能展示了如何在Flex中设置事件监听器并响应Flash元件的事件。 7. **性能优化**:由于Flash元件可能会增加应用程序的内存消耗和渲染负担,博主可能提到了一些优化技巧,如减少不必要的元件实例化、缓存位图等...

    FLEX和Actionscript开发FLASH游戏 flash游戏开发文档

    在开发Flash游戏的过程中,FLEX和ActionScript是两个至关重要的技术。FLEX是一个开放源代码的框架,主要用于构建富互联网应用程序(RIA),而ActionScript是Adobe Flash平台中的编程语言,用于控制动画、交互性和...

    关于flex与flash生成swf文件的加载(体积)问题

    这篇文章将深入探讨关于使用Flex和Flash生成SWF文件时所遇到的加载(体积)问题。SWF是Adobe Flash Player用于播放多媒体内容的文件格式,它包含了动画、交互式图形以及声音等多种元素。 首先,我们需要理解Flex和...

    Flex(Flash)与.net交互教程

    Flex(Flash)与.NET交互教程主要讲解了如何在Flex(基于Flash技术的RIA开发工具)和.NET框架之间建立通信,实现客户端与服务器端的数据交换。本文将深入介绍这个过程,包括必要的软件安装、项目的创建以及代码实现...

    Flex与Flash相互调用实例

    4. ExternalInterface:这个接口允许Flash内容与宿主环境(如HTML页面)进行通信,而Flex可以通过嵌入在HTML中的Flash Player与Flash内容进行交互。通过ExternalInterface,Flash可以调用JavaScript函数,而...

    使用FLEX 和 Actionscript开发FLASH 游戏(一)

    在这个文件中,你可以设置应用程序的属性,如宽度、高度、帧率等。例如: ```xml layout="absolute" width="600" height="400" frameRate="100" creationComplete="CreationComplete()" enterFrame="EnterFrame...

    Flex与Flash组合开发最佳实践__Combain Flex&Flash

    在IT行业中,Flex和Flash是两种非常重要的技术,它们在创建富互联网应用程序(RIA)时发挥了巨大作用。本文将深入探讨“Flex与Flash组合开发”的最佳实践,旨在帮助开发者更高效地利用这两种技术来构建交互性强、...

    使用 Flex 和 Flash Builder 开发手机应用程序

    同时,Flex和Flash Builder也支持在应用程序中嵌入字体,或者使用HTML文本。 在外观设计方面,Flex和Flash Builder提供了丰富的外观设计基础知识,允许开发者为手机应用程序创建外观,并应用自定义手机外观。 在...

    Flex 与 html 交互 调用本地html

    你需要确保在发布或测试环境中运行,或者更改Flash Player的安全设置以允许本地文件访问。此外,确保HTML和Flex的版本兼容,因为不同的版本可能有不同的API支持。 6. **调试与测试**:由于安全限制,调试过程可能...

    Flex获取设置html cookie

    Flex获取设置html cookie;Flex获取设置html cookie

Global site tag (gtag.js) - Google Analytics