forked from: forked from: スクロールバー (1)

by tepe forked from forked from: スクロールバー (1) (diff: 517)
矩形エリアにスクロールバーを実装する
リサイズにあわせてスクロールバーを調整する
マウスオーバーしないときは表示幅を狭くする
マウスオーバーでバーの幅を広くする
スクロールバー上にチャプターを設定する:
横スクロール実装

スクロールバー (1)
♥0 | Line 431 | Modified 2014-11-27 16:12:44 | MIT License
play

ActionScript3 source code

/**
 * Copyright tepe ( http://wonderfl.net/user/tepe )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/lSP2
 */

// forked from tepe's forked from: スクロールバー (1)
// forked from ProjectNya's スクロールバー (1)

//矩形エリアにスクロールバーを実装する
//リサイズにあわせてスクロールバーを調整する
//マウスオーバーしないときは表示幅を狭くする
//マウスオーバーでバーの幅を広くする
//スクロールバー上にチャプターを設定する:

//横スクロール実装

////////////////////////////////////////////////////////////////////////////////
//  スクロールバー (1)
////////////////////////////////////////////////////////////////////////////////

package {
    import flash.text.TextField;

    import flash.display.Sprite;
    import flash.display.Shape;
    import flash.geom.Matrix;
    import flash.display.GradientType;
    import flash.display.SpreadMethod;
    import flash.display.InterpolationMethod;

    [SWF(backgroundColor="#FFFFFF", width="465", height="465", frameRate="30")]

    public class Main extends Sprite {
        private var panel:Shape;
        private var _mask:Shape;
        private var scrollBar:ScrollBar;

        public function Main() {
            init();
        }

        private function init():void {
            var t:TextField = new TextField();
            //scrollBar.setTF(t);
            t.border = true;
            t.text = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n\n\n\n\n\n\n\n\n\n\ncc\n\n\n\n\n\n\n\n\n\n\n\nbb";
            t.multiline=true;
            t.type ="input";
            t.x = 30;
            t.y = 30;
            t.width=300;
            t.height=300;
            addChild(t);
            //scrollBar = new ScrollBar();
            //scrollBar.setTF(t);
            
            var v:vScr = new vScr();
            var h:hScr = new hScr();
            v.setTF(t);
            h.setTF(t);
            
        }

    }

}


////////////////////////////////////////////////////////////////////////////////
//  ScrollBarクラス
////////////////////////////////////////////////////////////////////////////////

import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.text.*;
class vScr extends Sprite {
    private var _width:uint = 16;
    private var _height:uint =16;
    
    private var track:Sprite;
    private var thumb:Sprite;

    private var maxHeight:uint;
    private var clickPos:Number;
    private var _enabled:Boolean = true;
    private var txt:TextField;

    public function vScr() {
        init();
    }

    
    
    public function setTF(tf:TextField):void{
        txt = tf;
        txt.addEventListener(Event.SCROLL,onScroll);
        tf.parent.addChild(this);
        resize();
        onScroll();
        
    }
    private function onScroll(e:Event=null):void{
        resize();
        var pos:Number =  maxHeight*(txt.scrollV / txt.maxScrollV);
        if (txt.scrollV == 0) pos = 0;
        if (txt.maxScrollV == txt.scrollV) pos = maxHeight;
        thumb.y = pos;
    }

    
    private function resize():void{        
        this.x = txt.x +txt.width  +1;
        this.y = txt.y;
        this.alpha = 0.5;
        _height = txt.height+1;
        
        if(txt.textHeight < txt.height){//スクロールバー非表示 
            txt.parent.removeChild(this);
            return;
        }
        var n:Number = txt.height / txt.textHeight;
        var thumbHeight:uint = _height*n;
        maxHeight = _height - thumbHeight;
 
        createTrack(_width,_height,0xaaaaaa);
        createThumb(_width,thumbHeight,0x888888);  
        txt.parent.addChild(this);//スクロールバー表示
        
    }

    
    private function init():void {

        track = new Sprite();
        thumb = new Sprite();
        addChild(track);
        addChild(thumb);
        enabled = true;
        thumb.mouseChildren = false;
    }

    

    //ドラッグ開始
    private function press(evt:MouseEvent=null):void {
        thumb.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true);
        //track.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true);
        stage.addEventListener(MouseEvent.MOUSE_UP, releaseOutside, false, 0, true);
        stage.addEventListener(Event.MOUSE_LEAVE, leave, false, 0, true);
        clickPos = thumb.mouseY;
        //clickPos = track.mouseY;
        stage.addEventListener(MouseEvent.MOUSE_MOVE, drag, false, 0, true);
    }
    //ドラッグ解除
    private function release(evt:MouseEvent):void {
        thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
        //track.removeEventListener(MouseEvent.MOUSE_UP, release);
        stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside);
        stage.removeEventListener(Event.MOUSE_LEAVE, leave);
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
    }
    
    private function releaseOutside(evt:MouseEvent):void {
        thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
        stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside);
        stage.removeEventListener(Event.MOUSE_LEAVE, leave);
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
    }
    private function leave(evt:MouseEvent):void {
        thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
        stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside);
        stage.removeEventListener(Event.MOUSE_LEAVE, leave);
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
    }
    
    //ドラッグ操作
    private function drag(evt:MouseEvent):void {
        var position:Number = stage.mouseY - clickPos;
        if (position < 0) position = 0;
        else if (position > maxHeight) position = maxHeight;
        
        thumb.y = position;
        txt.scrollV = Math.round(txt.maxScrollV*(position/maxHeight));
        evt.updateAfterEvent();
    }
    
    private function click(evt:MouseEvent):void {        
        var position:Number = track.mouseY - (thumb.height/2);
        if (position < 0) position = 0;
        if (position > maxHeight) position = maxHeight;
 
        thumb.y = position;
        txt.scrollV = Math.round(txt.maxScrollV*(position/maxHeight));
        evt.updateAfterEvent();
        press();
    }
    
    public function get enabled():Boolean {
        return _enabled;
    }
    public function set enabled(param:Boolean):void {
        _enabled = param;
        thumb.buttonMode = _enabled;
        thumb.mouseEnabled = _enabled;
        thumb.useHandCursor = _enabled;  
        track.mouseEnabled = _enabled;
        if (_enabled) {
            thumb.addEventListener(MouseEvent.MOUSE_DOWN, press, false, 0, true);
            track.addEventListener(MouseEvent.MOUSE_DOWN, click, false, 0, true);
        } else {
            thumb.removeEventListener(MouseEvent.MOUSE_DOWN, press);
            track.removeEventListener(MouseEvent.MOUSE_DOWN, click);
        }
    }
    
    //スクロール表示位置
    private function createThumb(w:uint, h:uint,c:uint):void {
        
        with(thumb){
            graphics.clear();
            graphics.beginFill(c);
            graphics.drawRect(0,0, w-1, h);
            graphics.endFill();
        }
    }
    
    //スクロール範囲
    private function createTrack(w:uint, h:uint,c:uint):void {
        with(track){
            graphics.clear();
            graphics.beginFill(c);
            graphics.drawRect(0,0, w-1, h);
            graphics.endFill();
        }
    }

}


////////////////////////////////////////////////////////////////////////////////
//  ScrollBarクラス
////////////////////////////////////////////////////////////////////////////////

import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.text.*;
class hScr extends Sprite {
    private var _width:uint = 16;
    private var _height:uint =16;
    
    private var track:Sprite;
    private var thumb:Sprite;

    private var maxWidth:uint;
    private var clickPos:Number;
    private var _enabled:Boolean = true;
    private var txt:TextField;

    public function hScr() {
        init();
    }

    
    
    public function setTF(tf:TextField):void{
        txt = tf;
        txt.addEventListener(Event.SCROLL,onScroll);
        tf.parent.addChild(this);       
        resize();
        onScroll();
        
    }
    //キー入力イベント
    private function onScroll(e:Event=null):void{
        resize();
        var n:Number = (txt.scrollH / txt.maxScrollH);
        var pos:Number =  maxWidth*n;
        if (txt.scrollH == 1) pos = 0;
        if (txt.maxScrollH == txt.scrollH) pos = maxWidth;
        thumb.x = pos;
    }
    

    public function onChange(e:Event=null):void{
        resize();
    }
    
    
    private function resize():void{        
        this.y = txt.y +txt.height +1;
        this.x = txt.x;
        this.alpha = 0.5;
        _width = txt.width +1;
        
        if(txt.textWidth < txt.width){//スクロールバー非表示 
            txt.parent.removeChild(this);
            return;
        }
        var n:Number = txt.width / txt.textWidth;
        var thumbWidth:uint = _width*n;
        maxWidth = _width - thumbWidth;
 
        createTrack(_width,_height,0xaaaaaa);
        createThumb(thumbWidth,_height,0x888888);  
        txt.parent.addChild(this);//スクロールバー表示
        
    }

    
    private function init():void {

        track = new Sprite();
        thumb = new Sprite();
        addChild(track);
        addChild(thumb);
        enabled = true;
        thumb.mouseChildren = false;
    }

    

    private function press(evt:MouseEvent=null):void {
        thumb.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true);
        //track.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true);
        stage.addEventListener(MouseEvent.MOUSE_UP, releaseOutside, false, 0, true);
        stage.addEventListener(Event.MOUSE_LEAVE, leave, false, 0, true);
        clickPos = thumb.mouseX;
        //clickPos = track.mouseY;
        stage.addEventListener(MouseEvent.MOUSE_MOVE, drag, false, 0, true);
    }
    private function release(evt:MouseEvent):void {
        thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
        //track.removeEventListener(MouseEvent.MOUSE_UP, release);
        stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside);
        stage.removeEventListener(Event.MOUSE_LEAVE, leave);
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
    }
    private function releaseOutside(evt:MouseEvent):void {
        thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
        stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside);
        stage.removeEventListener(Event.MOUSE_LEAVE, leave);
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
    }
    private function leave(evt:MouseEvent):void {
        thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
        stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside);
        stage.removeEventListener(Event.MOUSE_LEAVE, leave);
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
    }
    
    private function drag(evt:MouseEvent):void {
        var position:Number = stage.mouseX - clickPos;
        if (position < 0) position = 0;
        if (position > maxWidth) position = maxWidth;
        thumb.x = position;
        txt.scrollH = Math.round(txt.maxScrollH*(position/maxWidth));
        evt.updateAfterEvent();
    }
    
    private function click(evt:MouseEvent):void {        
        var position:Number = track.mouseX - (thumb.width/2);
        if (position < 0) position = 0;
        if (position > maxWidth) position = maxWidth;
 
        thumb.x = position;
        txt.scrollH = Math.round(txt.maxScrollH*(position/maxWidth));
        
        evt.updateAfterEvent();
        press();
    }
    
    public function get enabled():Boolean {
        return _enabled;
    }
    public function set enabled(param:Boolean):void {
        _enabled = param;
        thumb.buttonMode = _enabled;
        thumb.mouseEnabled = _enabled;
        thumb.useHandCursor = _enabled;  
        track.mouseEnabled = _enabled;
        if (_enabled) {
            thumb.addEventListener(MouseEvent.MOUSE_DOWN, press, false, 0, true);
            track.addEventListener(MouseEvent.MOUSE_DOWN, click, false, 0, true);
        } else {
            thumb.removeEventListener(MouseEvent.MOUSE_DOWN, press);
            track.removeEventListener(MouseEvent.MOUSE_DOWN, click);
        }
    }
    
    //スクロール表示位置
    private function createThumb(w:uint, h:uint,c:uint):void {
        
        with(thumb){
            graphics.clear();
            graphics.beginFill(c);
            graphics.drawRect(0,0, w-1, h);
            graphics.endFill();
        }
    }
    
    //スクロール範囲
    private function createTrack(w:uint, h:uint,c:uint):void {
        with(track){
            graphics.clear();
            graphics.beginFill(c);
            graphics.drawRect(0,0, w-1, h);
            graphics.endFill();
        }
    }

}

////////////////////////////////////////////////////////////////////////////////
//  ScrollBarクラス
////////////////////////////////////////////////////////////////////////////////

import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.text.*;
class ScrollBar extends Sprite {
    private var _width:uint = 16;
    private var _height:uint;
    
    private var track:Sprite;
    private var thumb:Sprite;

    private var maxHeight:uint;
//    private var target:DisplayObject;
//    private var rect:DisplayObject;
    private var clickPos:Number;
    private var _enabled:Boolean = true;
    private var txt:TextField;

    public function ScrollBar() {
        init();
    }

    
    
    public function setTF(tf:TextField):void{
        txt = tf;
        txt.addEventListener(KeyboardEvent.KEY_DOWN,onKey);
        tf.parent.addChild(this);
        onKey();
        
    }
    //キー入力イベント
    private function onKey(e:KeyboardEvent=null):void{
        resize();
        var pos:Number =  maxHeight*(txt.scrollV / txt.maxScrollV);
        if (txt.scrollV == 1) pos = 0;
        if (txt.maxScrollV == txt.scrollV) pos = maxHeight;
        thumb.y = pos;
        e.updateAfterEvent();
    }

    public function onChange(e:Event=null):void{
        resize();
    }
    
    
    private function resize():void{
        this.x = txt.x +txt.width -_width +1;
        this.y = txt.y;
        this.alpha = 0.5;
        _height = txt.height;
        
        if(txt.textHeight < txt.height){//スクロールバー非表示 
            txt.parent.removeChild(this);
            return;
        }
        var n:Number = txt.height / txt.textHeight;
        var thumbHeight:uint = _height*n;
        maxHeight = _height - thumbHeight;
 
        createTrack(_width,_height,0xaaaaaa);
        createThumb(_width,thumbHeight,0x888888);  
        txt.parent.addChild(this);//スクロールバー表示
        
    }

    
    private function init():void {

        track = new Sprite();
        thumb = new Sprite();
        addChild(track);
        addChild(thumb);
        enabled = true;
        thumb.mouseChildren = false;
    }

    

    private function press(evt:MouseEvent=null):void {
        thumb.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true);
        //track.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true);
        stage.addEventListener(MouseEvent.MOUSE_UP, releaseOutside, false, 0, true);
        stage.addEventListener(Event.MOUSE_LEAVE, leave, false, 0, true);
        clickPos = thumb.mouseY;
        //clickPos = track.mouseY;
        stage.addEventListener(MouseEvent.MOUSE_MOVE, drag, false, 0, true);
    }
    private function release(evt:MouseEvent):void {
        thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
        //track.removeEventListener(MouseEvent.MOUSE_UP, release);
        stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside);
        stage.removeEventListener(Event.MOUSE_LEAVE, leave);
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
    }
    private function releaseOutside(evt:MouseEvent):void {
        thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
        stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside);
        stage.removeEventListener(Event.MOUSE_LEAVE, leave);
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
    }
    private function leave(evt:MouseEvent):void {
        thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
        stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside);
        stage.removeEventListener(Event.MOUSE_LEAVE, leave);
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
    }
    
    private function drag(evt:MouseEvent):void {
        var position:Number = stage.mouseY - clickPos;
        if (position < 0) position = 0;
        if (position > maxHeight) position = maxHeight;
        thumb.y = position;
        txt.scrollV = Math.round(txt.maxScrollV*(position/maxHeight));
        evt.updateAfterEvent();
    }
    
    private function click(evt:MouseEvent):void {        
        var position:Number = track.mouseY - (thumb.height/2);
        if (position < 0) position = 0;
        if (position > maxHeight) position = maxHeight;
 
        thumb.y = position;
        txt.scrollV = Math.round(txt.maxScrollV*(position/maxHeight));
        evt.updateAfterEvent();
        press();
    }
    
    public function get enabled():Boolean {
        return _enabled;
    }
    public function set enabled(param:Boolean):void {
        _enabled = param;
        thumb.buttonMode = _enabled;
        thumb.mouseEnabled = _enabled;
        thumb.useHandCursor = _enabled;  
        track.mouseEnabled = _enabled;
        if (_enabled) {
            //_up();
            //thumb.addEventListener(MouseEvent.MOUSE_OVER, rollOver, false, 0, true);
            //thumb.addEventListener(MouseEvent.MOUSE_OUT, rollOut, false, 0, true);
            thumb.addEventListener(MouseEvent.MOUSE_DOWN, press, false, 0, true);
            track.addEventListener(MouseEvent.MOUSE_DOWN, click, false, 0, true);
        } else {
            //_off();
            //thumb.removeEventListener(MouseEvent.MOUSE_OVER, rollOver);
            //thumb.removeEventListener(MouseEvent.MOUSE_OUT, rollOut);
            thumb.removeEventListener(MouseEvent.MOUSE_DOWN, press);
            track.removeEventListener(MouseEvent.MOUSE_DOWN, click);
        }
    }
    
    //スクロール表示位置
    private function createThumb(w:uint, h:uint,c:uint):void {
        
        with(thumb){
            graphics.clear();
            graphics.beginFill(c);
            graphics.drawRect(0,0, w-1, h);
            graphics.endFill();
        }
    }
    
    //スクロール範囲
    private function createTrack(w:uint, h:uint,c:uint):void {
        with(track){
            graphics.clear();
            graphics.beginFill(c);
            graphics.drawRect(0,0, w-1, h);
            graphics.endFill();
        }
    }

}

Forked