Accelerating Scrollable Flex Control
The general concept of creating this control is using a Timer to control, scroll through your control before slowing down after it is being triggered by Mouse_Wheel.
So you need to listen to two events.
package com.controls.controls
{
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
import mx.controls.List;
public class CtlList extends List
{
public var sliderSpeed:Number=5;
public var sliderSlowSpeed:Number=1;
private var sliderAlreadyScrolling:Boolean=false;
private var QtyBeforeSlowDown:Number=5;
private var slideTimeCounter:Number=20;
private var currentSlideCounter:Number=slideTimeCounter;
private var DownDirection:Boolean=true;
public function CtlList()
{
this.addEventListener(MouseEvent.MOUSE_WHEEL, MouseWheel_Scrolling);
super();
}
private function MouseWheel_Scrolling(evt:MouseEvent):void
{
if (!sliderAlreadyScrolling)
{
/// do scrolling ///
DoScrolling(evt.delta);
}
else
{
///// Reset the Scrolling Behaviour ///
currentSlideCounter=slideTimeCounter;
}
}
private function DoScrolling(delta:Number):void
{
sliderAlreadyScrolling=true;
var ScrollTimer:Timer = new Timer(50, slideTimeCounter);
if (delta > 0)
{
DownDirection=false;
}
else
{
DownDirection=true;
}
ScrollTimer.addEventListener(TimerEvent.TIMER, ContinueScrolling);
ScrollTimer.addEventListener(TimerEvent.TIMER_COMPLETE, SlowDownScrolling);
ScrollTimer.start();
}
private function ContinueScrolling(evt:TimerEvent):void
{
var currentPosition:Number = this.verticalScrollBar.scrollPosition;
var maxPosition:Number = this.verticalScrollBar.maxScrollPosition;
var minPosition:Number = this.verticalScrollBar.minScrollPosition;
currentSlideCounter--;
if (DownDirection)
{
if ( currentPosition >= minPosition)
{
if (currentSlideCounter <= QtyBeforeSlowDown)
{
this.verticalScrollBar.scrollPosition = (currentPosition + sliderSlowSpeed);
super.scrollToIndex(this.verticalScrollBar.scrollPosition);
}
else
{
this.verticalScrollBar.scrollPosition = (currentPosition + sliderSpeed);
super.scrollToIndex(this.verticalScrollBar.scrollPosition);
}
}
}
else
{
if ( currentPosition <= maxPosition)
{
if (currentSlideCounter <= QtyBeforeSlowDown)
{
this.verticalScrollBar.scrollPosition = (currentPosition - sliderSlowSpeed);
super.scrollToIndex(this.verticalScrollBar.scrollPosition);
}
else
{
this.verticalScrollBar.scrollPosition = (currentPosition - sliderSpeed);
super.scrollToIndex(this.verticalScrollBar.scrollPosition);
}
}
}
}
private function SlowDownScrolling(evt:Event):void
{
this.verticalScrollBar.scrollPosition=0;
sliderAlreadyScrolling=false;
}
private function SetWheelInterval():void {
}
}
}
So you need to listen to two events.
package com.controls.controls
{
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
import mx.controls.List;
public class CtlList extends List
{
public var sliderSpeed:Number=5;
public var sliderSlowSpeed:Number=1;
private var sliderAlreadyScrolling:Boolean=false;
private var QtyBeforeSlowDown:Number=5;
private var slideTimeCounter:Number=20;
private var currentSlideCounter:Number=slideTimeCounter;
private var DownDirection:Boolean=true;
public function CtlList()
{
this.addEventListener(MouseEvent.MOUSE_WHEEL, MouseWheel_Scrolling);
super();
}
private function MouseWheel_Scrolling(evt:MouseEvent):void
{
if (!sliderAlreadyScrolling)
{
/// do scrolling ///
DoScrolling(evt.delta);
}
else
{
///// Reset the Scrolling Behaviour ///
currentSlideCounter=slideTimeCounter;
}
}
private function DoScrolling(delta:Number):void
{
sliderAlreadyScrolling=true;
var ScrollTimer:Timer = new Timer(50, slideTimeCounter);
if (delta > 0)
{
DownDirection=false;
}
else
{
DownDirection=true;
}
ScrollTimer.addEventListener(TimerEvent.TIMER, ContinueScrolling);
ScrollTimer.addEventListener(TimerEvent.TIMER_COMPLETE, SlowDownScrolling);
ScrollTimer.start();
}
private function ContinueScrolling(evt:TimerEvent):void
{
var currentPosition:Number = this.verticalScrollBar.scrollPosition;
var maxPosition:Number = this.verticalScrollBar.maxScrollPosition;
var minPosition:Number = this.verticalScrollBar.minScrollPosition;
currentSlideCounter--;
if (DownDirection)
{
if ( currentPosition >= minPosition)
{
if (currentSlideCounter <= QtyBeforeSlowDown)
{
this.verticalScrollBar.scrollPosition = (currentPosition + sliderSlowSpeed);
super.scrollToIndex(this.verticalScrollBar.scrollPosition);
}
else
{
this.verticalScrollBar.scrollPosition = (currentPosition + sliderSpeed);
super.scrollToIndex(this.verticalScrollBar.scrollPosition);
}
}
}
else
{
if ( currentPosition <= maxPosition)
{
if (currentSlideCounter <= QtyBeforeSlowDown)
{
this.verticalScrollBar.scrollPosition = (currentPosition - sliderSlowSpeed);
super.scrollToIndex(this.verticalScrollBar.scrollPosition);
}
else
{
this.verticalScrollBar.scrollPosition = (currentPosition - sliderSpeed);
super.scrollToIndex(this.verticalScrollBar.scrollPosition);
}
}
}
}
private function SlowDownScrolling(evt:Event):void
{
this.verticalScrollBar.scrollPosition=0;
sliderAlreadyScrolling=false;
}
private function SetWheelInterval():void {
}
}
}
Comments