package { import flash.display.StageQuality; import flash.display.StageScaleMode; import flash.display.StageAlign; import flash.display.Sprite; import flash.events.Event; import net.hires.debug.Stats; import org.libspark.thread.EnterFrameThreadExecutor; import org.libspark.thread.Thread; /** * ... * @author mee */ public class Main extends Sprite { public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point //start stage.quality = StageQuality.HIGH; stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; //addChild(new Stats()); if (!Thread.isReady) { Thread.initialize(new EnterFrameThreadExecutor()); } new MainThread(this).start(); } } } import flash.display.DisplayObjectContainer; import flash.display.Sprite; import flash.text.TextFieldAutoSize; import flash.text.TextField; import flash.text.TextFormat; import net.hires.debug.Stats; import org.libspark.thread.Thread; internal class MainThread extends Thread { private var _contentWrap:Sprite; private var _contentText:TextField; private var _parent:DisplayObjectContainer; public function MainThread(parent:DisplayObjectContainer) { _parent = parent; } override protected function run():void { _contentWrap = new Sprite(); _contentText = new TextField(); _contentWrap.addChild(_contentText); _contentWrap.width = 180; _contentWrap.height = 200; var fmt:TextFormat = new TextFormat(); fmt.size = 16; _contentText.defaultTextFormat = fmt; _contentText.width = 200; _contentText.autoSize = TextFieldAutoSize.LEFT; _contentText.multiline = _contentText.wordWrap = true; _contentText.htmlText = "asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />asdfasdfasdf<br />"; _parent.addChild(_contentWrap); var _mask:Sprite = new Sprite(); _mask.graphics.beginFill(0xffffff); _mask.graphics.drawRect(0, 0, 180, 180); _mask.graphics.endFill(); _contentWrap.mask = _mask; var _scrollBar:Sprite = new Sprite(); _scrollBar.buttonMode = true; _scrollBar.graphics.beginFill(0x999999); _scrollBar.graphics.drawRect(190, 0, 10, 200); _scrollBar.graphics.endFill(); _parent.addChild(_scrollBar); var _scrollRange:Sprite = new Sprite(); _scrollRange.buttonMode = true; _scrollRange.graphics.beginFill(0x000000); _scrollRange.graphics.drawRect(190, 0, 10, 50); _scrollRange.graphics.endFill(); _parent.addChild(_scrollRange); new ScrollBarThread(_parent, _scrollRange, _scrollBar, _contentWrap, _mask).start(); _parent.addChild(new Stats()); } override protected function finalize():void { } } import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.events.MouseEvent; import org.libspark.thread.Thread; import org.libspark.thread.threads.tweener.TweenerThread; internal class ScrollBarThread extends Thread { private var _stage:DisplayObjectContainer; private var _bar:DisplayObject; private var _range:DisplayObject; private var _content:DisplayObject; private var _mask:DisplayObject; private var yOffset:Number; private var yMin:Number; private var yMax:Number; public function ScrollBarThread(stage:DisplayObjectContainer, bar:DisplayObject, range:DisplayObject, content:DisplayObject, mask:DisplayObject) { _stage = stage; _bar = bar; _range = range; _content = content; _mask = mask; yOffset = 0; yMin = 0; yMax = _range.height - _bar.height; } override protected function run():void {trace('ScrollBarThread::run'); next(waitScroll); } private function waitScroll():void {trace('ScrollBarThread::waitScroll'); event(_bar, MouseEvent.MOUSE_DOWN, barCatch); event(_range, MouseEvent.CLICK, barClick); } private function barClick(e:MouseEvent):void {trace('ScrollBarThread::barClick'); _bar.y = _stage.mouseY - _bar.height + 15; if (_bar.y <= yMin) _bar.y = yMin; if (_bar.y >= yMax) _bar.y = yMax; var _percent:Number = _bar.y / yMax; new TweenerThread(_content, { y: ( -_percent * (_content.height - _mask.height)) + 10, time:1 }).start(); next(waitScroll); } private function barCatch(e:MouseEvent):void {trace('ScrollBarThread::barCatch'); event(_stage, MouseEvent.MOUSE_UP, barRelease); event(_stage, MouseEvent.MOUSE_MOVE, barMove); yOffset = _stage.mouseY - _bar.y; } private function barRelease(e:MouseEvent):void {trace('ScrollBarThread::barRelease'); next(waitScroll); } private function barMove(e:MouseEvent = null):void {trace('ScrollBarThread::barMove'); event(_stage, MouseEvent.MOUSE_UP, barRelease); _bar.y = _stage.mouseY - yOffset; if (_bar.y <= yMin) _bar.y = yMin; if (_bar.y >= yMax) _bar.y = yMax; var _percent:Number = _bar.y / yMax; new TweenerThread(_content, { y: ( -_percent * (_content.height - _mask.height)) + 10, time:1.0 }).start(); e.updateAfterEvent(); event(_stage, MouseEvent.MOUSE_MOVE, barMove); //next(barMove); } override protected function finalize():void {trace('ScrollBarThread::finalize'); } } scrollbar threadlibrary flash on 2009-8-9