Вот класс, реализующий вертикальный скролл, писал мульон лет назад, может иметь не совсем оптимизированный алгоритм, но работает как часы. Разбирайся на здоровье
Код AS3:
package Admin.fElements
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Rectangle;
public class Scroll extends Sprite
{
private var __width:int = 100;
private var __height:int = 100;
private var __color:uint = 0x000000;
private var __sprite:Sprite = new Sprite()
public function Scroll()
{
super();
__draw.useHandCursor = true;
__draw.buttonMode = true;
this.addEventListener(Event.ADDED_TO_STAGE, addStage);
}
private function addStage(e:Event):void
{
stage.addEventListener(MouseEvent.MOUSE_UP, outDraw);
}
public function set setHeight(value:int):void
{
__height = value;
}
public function set setWidth(value:int):void
{
__width = value;
}
public function set setColor(value:uint):void
{
__color = value;
}
private var __content:Sprite;
private var __HC:Number;
public function set setContent(value:Sprite):void
{
__content = null
__content = value;
__HC = __content.height;
start();
}
public function get setContent():Sprite
{
return __content;
}
private var __line:Sprite = new Sprite();
private var __draw:Sprite = new Sprite();
private var __rectangle:Rectangle;
private var __HD:int;
private var __maxY:int;
private function start():void
{
if (__HC > __height)
{
this.graphics.beginFill(0xffffff, 0);
this.graphics.lineStyle(0, 0xffffff, 0);
this.graphics.drawRect(0,0, __width, __height);
this.graphics.endFill();
__content.scrollRect = new Rectangle(0,0,__width,__height);
addChild(__content);
__line.graphics.beginFill(__color);
__line.graphics.lineStyle(0, __color);
__line.graphics.moveTo(__width-4, __height);
__line.graphics.lineTo(__width-4, 0);
__HD = (__height * (__height/__HC * 100)) / 100;
__draw.graphics.beginFill(__color);
__draw.graphics.lineStyle(0, __color);
__draw.graphics.drawRect(0, 0, 4, __HD);
this.addEventListener(MouseEvent.MOUSE_WHEEL, wheel);
__maxY = __content.height - __height;
addChild(__line);
addChild(__draw);
__draw.x = __width-6;
__draw.y = 0;
//__draw.addEventListener(MouseEvent.MOUSE_OVER, overDraw);
//stage.addEventListener(MouseEvent.MOUSE_UP, outDraw);
__draw.addEventListener(MouseEvent.MOUSE_DOWN, downDraw);
}
else
{
__content.scrollRect = new Rectangle(0,0,__width,__height);
addChild(__content);
}
}
private var __Y:int=0;
private var __backWheel:int;
private var __result:int=0;
private function wheel(e:MouseEvent):void
{
if (__backWheel > 0) {__Y-=20;} else {__Y+=20};
__backWheel = e.delta;
if (__Y > __maxY) __Y = __maxY;
if (__Y < 0) __Y = 0;
__content.scrollRect = new Rectangle(0,__Y,__width,__height);
__draw.graphics.clear();
__draw.graphics.beginFill(__color);
__draw.graphics.lineStyle(0, __color);
__result = __height*(__Y/__HC*100)/100;
__draw.graphics.drawRect(0, 0, 4, __HD);
__draw.x = __width-6;
__draw.y = __result;
}
private var drawWidth:Number = 0;
private function overDraw(e:MouseEvent):void
{
this.removeEventListener(Event.ENTER_FRAME, outDrawListener);
this.addEventListener(Event.ENTER_FRAME, overDrawListener);
}
private function overDrawListener(e:Event):void
{
if (drawWidth < 4)
{
drawWidth+=0.6;
__draw.graphics.clear();
__draw.graphics.beginFill(__color);
__draw.graphics.lineStyle(0, __color);
__draw.graphics.drawRect(0, 0, 4+drawWidth, __HD);
__draw.x = __width-6 - drawWidth/2;
__draw.y = __result;
}
else
{
this.removeEventListener(Event.ENTER_FRAME, overDrawListener);
drawWidth = 4;
}
}
private function outDraw(e:MouseEvent):void
{
this.removeEventListener(Event.ENTER_FRAME, downDrawListener);
this.removeEventListener(Event.ENTER_FRAME, overDrawListener);
this.addEventListener(Event.ENTER_FRAME, outDrawListener);
}
private function outDrawListener(e:Event):void
{
if (drawWidth > 0)
{
drawWidth-=0.6;
__draw.graphics.clear();
__draw.graphics.beginFill(__color);
__draw.graphics.lineStyle(0, __color);
__draw.graphics.drawRect(0, 0, 4-drawWidth, __HD);
__draw.x = __width-6 + drawWidth/2;
__draw.y = __result;
}
else
{
this.removeEventListener(Event.ENTER_FRAME, outDrawListener);
drawWidth = 0;
}
}
private var __drawY:Number;
private var fDrawY:int;
private function downDraw(e:MouseEvent):void
{
this.addEventListener(Event.ENTER_FRAME, downDrawListener);
var draw:Sprite = Sprite(e.currentTarget);
fDrawY = draw.mouseY
}
private function downDrawListener(e:Event):void
{
__drawY = this.mouseY - fDrawY;
var Y:int = (100 * __drawY/__height) * __HC/100;
if (Y > __maxY) Y = __maxY;
if (Y < 0) Y = 0;
if (__drawY > __height - __HD) __drawY = __height - __HD;
if (__drawY < 0) __drawY = 0;
__content.scrollRect = new Rectangle(0,Y,__width,__height);
__draw.y = __drawY;
__result = __draw.y;
__Y = Y;
}
}
}
|