Hi All

I've been having problems with the amount of scrolling that happens when
you use the mouse-wheel with VScrollBar. I came up with two possible
solutions(well actually my co-worked came up with the one and I came up
with the other), one is to prevent the default behaviour of the
mouseWheelChanging event. The other was to extend the vScrollbar class and
overwrite some functionality inside it. Both implementations are below. The
problem is that while both of these solutions work inside of firefox and
chrome, they don't seem to work in IE9, I'm guessing that IE9 is somehow
sending mouse-wheel events differently to the way it's done with the
flashplayer in the other browsers.

Has anyone encountered this before and know of a workaround?

Thanks

Wouter

like so:

---------------------------------------MXML-------------------------------------------------
<s:VScrollBar
id="vScrollBar" viewport="{grpContent}"
mouseWheelChanging="MouseWheelInhibitor.mouseWheelChangingHandler(event)"
/>
--------------------------------------- AS
-------------------------------------------------
package za.co.briteblue.twentytwoseven.presentation.components
{
import mx.events.FlexMouseEvent;
 import spark.components.VScrollBar;

public class MouseWheelInhibitor
 {
public static function mouseWheelChangingHandler(event:FlexMouseEvent):void
 {
// don't scroll by preventing default
event.preventDefault();
 // est amount to scroll based on height of viewport.
var delta:Number = VScrollBar(event.target).viewport.height / 20;
 if(event.delta < 0)
VScrollBar(event.target).viewport.verticalScrollPosition += delta;
 else
VScrollBar(event.target).viewport.verticalScrollPosition -= delta;
 }
}
}

----------------------------------- other solution extending the vscrollbar
class -----------------------------------------

package za.co.briteblue.twentytwoseven.presentation.components
{
import flash.events.Event;
import flash.events.MouseEvent;
 import mx.core.IInvalidating;
import mx.core.mx_internal;
 import mx.events.FlexMouseEvent;
 import spark.components.VScrollBar;
 import spark.core.IViewport;
import spark.core.NavigationUnit;
import spark.utils.MouseEventUtil;
 use namespace mx_internal;
 public class TTSVScrollBar extends VScrollBar
{
public function TTSVScrollBar()
 {
super();
}
 // @author: braam
// overridden to prevent viewport forced validation with every vertical
scroll position update.
 // when viewport is a datagrid, performance is terrible for mouse wheel
scrolling.
override mx_internal function mouseWheelHandler(event:MouseEvent):void
 {
const vp:IViewport = viewport;
if (event.isDefaultPrevented() || !vp || !vp.visible || !visible)
 return;
 // Dispatch the "mouseWheelChanging" event. If preventDefault() is called
 // on this event, the event will be cancelled.  Otherwise if  the delta
// is modified the new value will be used.
 var changingEvent:FlexMouseEvent =
MouseEventUtil.createMouseWheelChangingEvent(event);
if (!dispatchEvent(changingEvent))
 {
event.preventDefault();
return;
 }
 const delta:int = changingEvent.delta;
 var nSteps:uint = Math.abs(delta);
var navigationUnit:uint;
 var scrollPositionChanged:Boolean;
 // Scroll delta "steps".
 navigationUnit = (delta < 0) ? NavigationUnit.DOWN : NavigationUnit.UP;
for (var vStep:int = 0; vStep < nSteps; vStep++)
 {
var vspDelta:Number = vp.getVerticalScrollPositionDelta(navigationUnit);
 if (!isNaN(vspDelta))
{
vp.verticalScrollPosition += vspDelta;
 scrollPositionChanged = true;
// if (vp is IInvalidating)
// IInvalidating(vp).validateNow();
 }
}
 if (scrollPositionChanged)
dispatchEvent(new Event(Event.CHANGE));
 event.preventDefault();
}
}
}

Reply via email to