BONKURA BLOG

仕事のメモ帳ブログ。いまのところActionScriptメイン。たまにCSSとかJavaScriptとか。

[AS3.0]AS3版スクロールバー修正

以前アップしたエントリーのマウスホイールまわりの動きが怪しかったので改善しました。
このライブラリが不具合の原因でした。
pixelbreaker : AS3.0 MouseWheel on Mac OS X
Sparkでみつけたこっちのライブラリのほうが全然良かったです。制作者さま多謝!
HigeWheel - Spark project
package  
{
	import flash.display.DisplayObjectContainer;
	import org.libspark.utils.ui.HIGEWheel;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	public class ScrollBar extends MovieClip
	{
		private var yMin:Number;
		private var yMax:Number;
		private var yOffset:Number;
		private var friction:Number = 0.2;
		
		public function ScrollBar() 
		{	
			HIGEWheel.initialize(stage);
		}
		
		public function start(initMode:Boolean=false, resizeTH:Boolean=false):void
		{	
			HIGEWheel.initialize(stage);
			
			if (initMode == true) 
			{
				initMove();
			}
			else 
			{
				setup();
			}
			
			if (resizeTH == true) 
			{
				var scrollBox:MovieClip = parent as MovieClip;
				
				var mPc:Number = scrollBox.masker.height / scrollBox.content.height;
				thumb.height = track.height * mPc;
			}
			
			yMin = 0;
			yMax = track.height - thumb.height;
		}
		
		public function initMove():void
		{
			thumb.addEventListener(Event.ENTER_FRAME, xInitMoveHandler);
		}
		
		private function setup():void
		{
			var sb:MovieClip = this.parent as MovieClip;
			thumb.buttonMode = true;
			thumb.addEventListener(MouseEvent.MOUSE_DOWN, thumbDown);
			thumb.addEventListener(MouseEvent.MOUSE_UP, thumUp);
			stage.addEventListener(MouseEvent.MOUSE_UP, thumUp);
			
			track.addEventListener(MouseEvent.MOUSE_DOWN, trackDown);
			stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelHandler); 
			
		}
		
		private function thumbDown(e:MouseEvent):void 
		{
			stage.addEventListener(MouseEvent.MOUSE_MOVE, thumbMove);
			yOffset = mouseY - thumb.y;
		}

		private function thumUp(e:MouseEvent):void 
		{
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, thumbMove);
			thumb.removeEventListener(Event.ENTER_FRAME, trackEnterframeHandler);
			thumb.stopDrag();
		}
				
		private function thumbMove(e:MouseEvent):void 
		{
			thumb.y = mouseY - yOffset;
			mouseLink();
			e.updateAfterEvent();
		}
		
		private function trackDown(e:MouseEvent):void
		{
			thumb.addEventListener(Event.ENTER_FRAME, trackEnterframeHandler);
		}
		
		private function trackEnterframeHandler(e:Event):void 
		{
			var dis:Number = mouseY - thumb.y;
			thumb.y += dis * friction;
			mouseLink();
			if (mouseY > yMax) 
			{
				var dis2:Number = yMax - thumb.y;
				if (dis2 <= 0.5) 
				{
					thumb.y = yMax;
				}
				thumb.y += dis2 * friction;
			}
			scrollEventCall();
		}
		
		private function mouseWheelHandler(e:MouseEvent):void
		{
			thumb.y = thumb.y - e.delta * 2;
			mouseLink();
		}
		
		private function mouseLink():void
		{
			if (thumb.y <= yMin) 
			{
				thumb.y = yMin;
			}
			if (thumb.y >= yMax) 
			{
				thumb.y = yMax;
			}
			scrollEventCall();
		}
		
		private function scrollEventCall():void
		{
			var v:Number = thumb.y / yMax;
			dispatchEvent(new ScrollBarEvent(ScrollBarEvent.VALUE_CHANGED, v));
		}
		
		private function xInitMoveHandler(e:Event):void
		{
			var dis:Number = yMax - thumb.y;
			if (dis <= 0.5) 
			{
				thumb.y = yMax;
				thumb.removeEventListener(Event.ENTER_FRAME, xInitMoveHandler);
				thumb.addEventListener(Event.ENTER_FRAME, xInitRemoveHandler);
			}
			thumb.y += dis * friction;
			scrollEventCall();
		}
		
		private function xInitRemoveHandler(e:Event):void
		{
			var dis:Number = yMin - thumb.y;
			thumb.y += dis * friction;
			
			scrollEventCall();
			if (thumb.y <= 1) 
			{
				thumb.y = yMin;
				thumb.removeEventListener(Event.ENTER_FRAME, xInitRemoveHandler);
				setup();
			}
		}
		
	}
	
}
package  
{
	import caurina.transitions.Tweener;
	import flash.display.MovieClip;
	
	public class ScrollBox extends MovieClip
	{	
		public function ScrollBox() 
		{
			if (masker.height > content.height) 
			{
				sb.visible = false;
			}
			sb.addEventListener(ScrollBarEvent.VALUE_CHANGED, sbChange);
		}
		
		private function sbChange(e:ScrollBarEvent):void 
		{
			Tweener.addTween(content, { y:( -e.v * (content.height - masker.height)), time:1 } );
		}
		
	}
	
}
swfobject1.5ではなく、2を使っていることに注意です。 HTML側の記述はこんな感じ。headタグ内のswfobject読み込み部分は省略。
このエントリーをはてなブックマークに追加 Save This Page to del.icio.us
  1. nobu

    HIGEWheel を使って頂いてありがとうございます :-)

  2. ojiboss

    AS3版スクロールバーのscrollbar.flaがダウンロードしようと
    リンクをクリックするとNot Foundとなります。
    AS3からの初心者で勉強させていただいています。
    ダウンロードできるようにしていただけると助かります。
    よろしくお願いします。