/* * そうめん ThreadLibrary の練習 * ThreadLibraryを使ってscrollbarを書いてみる * * とりあえず動いてる...みたい * うまい書き方がわからない * mouse操作のみ */ package { import flash.display.Sprite; import flash.events.Event; import org.libspark.thread.EnterFrameThreadExecutor; import org.libspark.thread.Thread; /** * ... * @author mee_nanana */ 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 if (!Thread.isReady) { Thread.initialize(new EnterFrameThreadExecutor()); } new MainThread(this).start(); } } } import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.display.GradientType; import flash.geom.Matrix; import org.libspark.thread.Thread; import org.libspark.thread.threads.tweener.TweenerThread; internal class MainThread extends Thread { private var _layer:DisplayObjectContainer; private var _wrapper:Sprite; private var _content:DisplayObject; private var _mask:DisplayObject; private var _bar:Sprite; private var _back:Sprite; private var t:ScrollBarThread; public function MainThread(layer:DisplayObjectContainer) { _layer = layer; } protected override function run():void { var items:Items = new Items(); this._content = items._image; this._mask = items._mask; this._content.mask = this._mask; this._bar = items._scrollBar; this._back = items._barBack; t = new ScrollBarThread(_layer, _bar, _back, _content, _mask); t.start(); t.join(); _wrapper = new Sprite(); _wrapper.addChild(_back); _wrapper.addChild(_bar); _wrapper.addChild(_content); _layer.addChild(_wrapper); } } internal class ScrollBarThread extends Thread { private var _layer:DisplayObjectContainer; private var _bar:DisplayObject; private var _back:DisplayObject; private var _content:DisplayObject; private var _mask:DisplayObject; private var _tween:TweenerThread; private var yOffset:Number; private var yMin:Number; private var yMax:Number; private var percent:Number; public function ScrollBarThread(layer:DisplayObjectContainer, bar:DisplayObject, back:DisplayObject, content:DisplayObject, mask:DisplayObject) { _layer = layer; _bar = bar; _back = back; _content = content; _mask = mask; yOffset = 0; yMin = 0; yMax = _back.height - _bar.height; } protected override function run():void {//trace('run'); scrollWait(); } //ここからstartしてscrollが終わるとまた戻ってくる予定 private function scrollWait():void {//trace('scrollWait'); event(_bar, MouseEvent.MOUSE_DOWN, barDown); } //scrollbarをつかむ private function barDown(e:MouseEvent):void {//trace('barDown'); event(_layer.stage, MouseEvent.MOUSE_MOVE, barMove); yOffset = _layer.stage.mouseY - _bar.y; event(_layer.stage, MouseEvent.MOUSE_UP, barUp); } //scrollbarをはなす private function barUp(e:MouseEvent):void {//trace('barUp'); //eventを削除 //この書き方でいいのかどうか... _layer.stage.removeEventListener(MouseEvent.MOUSE_MOVE, barMove); _layer.stage.removeEventListener(MouseEvent.MOUSE_UP, barUp); next(scrollWait); } //scrollbarを動かす private function barMove(e:MouseEvent = null):void {//trace('barMove'); _bar.y = _layer.stage.mouseY - yOffset; if (_bar.y <= yMin) _bar.y = yMin; if (_bar.y >= yMax) _bar.y = yMax; _bar.dispatchEvent(new ScrollBarEvent(_bar.y / yMax)); //eventで書くと動かない...理由はわかりません //↓2行の違いがよくわかってないせい _bar.addEventListener(ScrollBarEvent.VALUE_CHANGED, contentScroll); //event(_bar, ScrollBarEvent.VALUE_CHANGED, contentScroll); event(_layer.stage, MouseEvent.MOUSE_MOVE, barMove); event(_layer.stage, MouseEvent.MOUSE_UP, barUp); //↓無いとeventに引っかからずfinalizeに行ってしまう next(barMove); } //ScrollBarEventから 対象をscroll private function contentScroll(e:ScrollBarEvent):void {//trace('contentScroll'); _tween = new TweenerThread(_content, { y:(-e._percent * (_content.height - _mask.height)), time:1 } ); _tween.start(); _tween.join(); } protected override function finalize():void {//trace('finalize'); } } internal class ScrollBarEvent extends Event { public static const VALUE_CHANGED:String = "valueChanged"; public var _percent:Number; public function ScrollBarEvent(percent:Number) { super(VALUE_CHANGED); _percent = percent } } internal class Items extends Sprite { public var _image:Sprite; public var _mask:Sprite; public var _scrollBar:Sprite; public var _barBack:Sprite; public function Items() { _image = new Sprite(); var gradientBoxMatrix:Matrix = new Matrix(); gradientBoxMatrix.createGradientBox(300, 600, 0, 0, 0); _image.graphics.beginGradientFill(GradientType.RADIAL, [0xFFCCCC, 0x00FF00, 0x0000FF], [1, 1, 1], [0, 128, 255], gradientBoxMatrix); _image.graphics.drawRect(0, 0, 300, 600); _image.graphics.endFill(); //addChild(_image); _mask = new Sprite(); _mask.graphics.beginFill(0x000000); _mask.graphics.drawRect(0, 0, 300, 300); _mask.graphics.endFill(); //addChild(masker); _scrollBar = new Sprite(); _scrollBar.graphics.beginFill(0xFF1122); _scrollBar.graphics.drawRect(310, 0, 10, 30); _scrollBar.graphics.endFill(); //addChild(_scrollBar); _barBack = new Sprite; _barBack.graphics.beginFill(0xFF8899); _barBack.graphics.drawRect(310, 0, 10, 300); _barBack.graphics.endFill(); //addChild(_barBack); } } ThreadLibraryそうめんでscrollbar