Arregle MouseWheel en una aplicación Flex cuando wmode = "opaque" (en realidad funciona en IE, simplemente no Firefox o Chrome, probablemente tampoco Safari u Opera). Esto también corrige las diferentes velocidades de desplazamiento MouseWheel entre Firefox y todo lo demás.
Agregue este JavaScript a su envoltorio: .
if(window.addEventListener) {
var eventType = (navigator.userAgent.indexOf('Firefox') !=-1) ? "DOMMouseScroll" : "mousewheel";
window.addEventListener(eventType, handleWheel, false);
}
function handleWheel(event) {
var app = document.getElementById("YOUR_APPLICATION");
var edelta = (navigator.userAgent.indexOf('Firefox') !=-1) ? -event.detail : event.wheelDelta/40;
var o = {x: event.screenX, y: event.screenY,
delta: edelta,
ctrlKey: event.ctrlKey, altKey: event.altKey,
shiftKey: event.shiftKey}
app.handleWheel(o);
}
y soltar esta clase de apoyo en su archivo MXML principal (Declaraciones para Flex4): .
package {
import flash.display.InteractiveObject;
import flash.display.Shape;
import flash.display.Stage;
import flash.events.MouseEvent;
import flash.external.ExternalInterface;
import flash.geom.Point;
import mx.core.FlexGlobals;
import mx.core.UIComponent;
import mx.events.FlexEvent;
public class MouseWheelSupport {
//--------------------------------------
// Constructor
//--------------------------------------
public function MouseWheelSupport() {
FlexGlobals.topLevelApplication.addEventListener(FlexEvent.APPLICATION_COMPLETE, attachMouseWheelHandler);
}
//------------------------------------------------------------------------------
//
// Functions
//
//------------------------------------------------------------------------------
//--------------------------------------
// Private
//--------------------------------------
private function attachMouseWheelHandler(event : FlexEvent) : void {
ExternalInterface.addCallback("handleWheel", handleWheel);
}
private function handleWheel(event : Object) : void {
var obj : InteractiveObject = null;
var applicationStage : Stage = FlexGlobals.topLevelApplication.stage as Stage;
var mousePoint : Point = new Point(applicationStage.mouseX, applicationStage.mouseY);
var objects : Array = applicationStage.getObjectsUnderPoint(mousePoint);
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,
mousePoint.x, mousePoint.y, obj,
event.ctrlKey, event.altKey, event.shiftKey,
false, Number(event.delta));
obj.dispatchEvent(mEvent);
}
}
}
}
Ejemplo de JavaScript :.
<script type="text/javascript">
// For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection.
var swfVersionStr = "10.1.0";
// To use express install, set to playerProductInstall.swf, otherwise the empty string.
var xiSwfUrlStr = "playerProductInstall.swf";
var flashvars = {};
var params = {};
params.quality = "high";
params.bgcolor = "#ffffff";
params.allowscriptaccess = "sameDomain";
params.allowfullscreen = "true";
params.wmode = "opaque";
var attributes = {};
attributes.id = "YOURAPP";
attributes.name = "YOURAPP";
attributes.align = "middle";
if(window.addEventListener) {
var eventType = (navigator.userAgent.indexOf('Firefox') !=-1) ? "DOMMouseScroll" : "mousewheel";
window.addEventListener(eventType, handleWheel, false);
}
function handleWheel(event) {
var app = document.getElementById("YOURAPP");
var edelta = (navigator.userAgent.indexOf('Firefox') !=-1) ? -event.detail : event.wheelDelta/40;
var o = {x: event.screenX, y: event.screenY,
delta: edelta,
ctrlKey: event.ctrlKey, altKey: event.altKey,
shiftKey: event.shiftKey}
app.handleWheel(o);
}
swfobject.embedSWF(
"YOURAPP.swf", "flashContent",
"100%", "100%",
swfVersionStr, xiSwfUrlStr,
flashvars, params, attributes);
// JavaScript enabled so display the flashContent div in case it is not replaced with a swf object.
swfobject.createCSS("#flashContent", "display:block;text-align:left;");
</script>
Gracias por su respuesta. Primero comencé a sacar el param wmode (era opaco por defecto) y funciona bien en IE, Chrome y FF, pero leí que si no pones nada se configura como "ventana" y solo se recomienda en win2. Me gustaría usar mi aplicación en dispositivos móviles (con Android), ¿será un problema? Luego intenté con lo que dijiste, pero no sé nada sobre javascript, así que puse ese código en mi history.js y en la index-template (y el otro código en mi main.mxml) sin éxito ... ¿podrías explicarme un poco más? ? – alicia
¿Está utilizando Flash Builder para generar su envoltorio HTML? –
Sí, utilizo Flash Builder – alicia