スクロールのクラスを制作する。(自分用)
前に制作したNM_Sliderset を改良してスクロールのクラスを制作する。
スクロール関係のクラスは便利なライブラリがいくつかあるけど、細かい動きを自分の好みどおりに設定できなかったり、スクロールの挙動が気に入らなかったりしたので自分で制作することにした。
コンテンツ内のボタンをドラッグした時スクロールのマスクの外に出すのに一苦労した。
package {
import flash.display.*;
import flash.events.*;
public class main extends MovieClip {
//-------------------------------------------------------------------------------- Properties
private var _this:MovieClip;
private var _stage:Stage;
//-------------------------------------------------------------------------------- Constractor
public function main() {
_this = this;
}
//-------------------------------------------------------------------------------- Function
/**
* initialize
*/
public function Init(setupargs:Object):void {
_stage = setupargs.stage;
setup(setupargs);
}
/**
* start
*/
public function Start():void {
}
/**
* setup
*/
private function setup(setupargs:Object):void {
setup_scrollcontent(setupargs);
setup_scrollpane(setupargs);
}
/**
* setup scrollcontent
*/
private var _scrollcontent:MovieClip;
private function setup_scrollcontent(setupargs:Object):void {
_scrollcontent = new scrollcontent();
var args:Object = {};
args.stage = _stage;
args.parentmc = _this;
_scrollcontent.Init(args);
}
/**
* setup scrollpane
*/
private var _scrollpane:MovieClip;
private var _sliderup:MovieClip;
private var _sliderdown:MovieClip;
private function setup_scrollpane(setupargs:Object):void {
_scrollpane = new NM_Scrollpane();
var args:Object = {};
args.stage = _stage;
args.parentmc = _this;
args.scrolltarget = _scrollcontent;
args.scrollmax = _scrollcontent.height - 200;
args.scrolleaseval = .2;
args.basesliderval = .02;
args.basesliderspeedup = .001;
args.maskwid = _scrollcontent.width + 30;
args.maskhei = 420;
args.maskx = -50;
args.masky = -50;
args.slidersize = 360;
args.slidersetx = 430;
args.slidersety = -20;
var _slider_grip = new slider_grip();
_slider_grip.buttonMode = true;
var _slider_base = new slider_base();
_slider_base.buttonMode = true;
_slider_base.base.height = args.slidersize + _slider_grip.height;
_slider_base.base.y = -_slider_grip.height / 2;
args.slider_grip = _slider_grip;
args.slider_base = _slider_base;
_scrollpane.Init(args);
var waku:MovieClip = new MovieClip();
waku.mouseEnabled = false;
waku.mouseChildren = false;
var wakug:Graphics = waku.graphics;
wakug.lineStyle(1, 0xEEEEEE, 1);
wakug.drawRect(args.maskx, args.masky, args.maskwid, args.maskhei);
wakug.endFill();
_scrollpane.addChild(waku);
_sliderup = new slider_up();
_sliderdown = new slider_down();
_sliderup.x = 180;
_sliderup.y = -55;
_sliderdown.x = 180;
_sliderdown.y = 380;
_sliderup.buttonMode = true;
_sliderdown.buttonMode = true;
_scrollpane.addChild(_sliderup);
_scrollpane.addChild(_sliderdown);
_sliderup.addEventListener(MouseEvent.MOUSE_DOWN, sliderup_mousedown);
_sliderdown.addEventListener(MouseEvent.MOUSE_DOWN, sliderdown_mousedown);
_this.addChild(_scrollpane);
_scrollpane.addEventListener(MouseEvent.MOUSE_WHEEL, wheelscroll);
var _back = new MovieClip();
var backg:Graphics = _back.graphics;
backg.beginFill(0x000000, 0);
backg.drawRect(args.maskx, args.masky, args.maskwid + 20, args.maskhei);
backg.endFill();
_scrollpane.addChildAt(_back, 0);
}
//
private function sliderup_mousedown(eo:* = null):void {
_scrollpane.startContinueUp(.02, 0, .0005);
_stage.addEventListener(MouseEvent.MOUSE_UP, sliderup_mouseup);
}
//
private function sliderup_mouseup(eo:* = null):void {
_scrollpane.stopContinueUp();
_stage.removeEventListener(MouseEvent.MOUSE_UP, sliderup_mouseup);
}
//
private function sliderdown_mousedown(eo:* = null):void {
_scrollpane.startContinueDown(.02, 1, .0005);
_stage.addEventListener(MouseEvent.MOUSE_UP, sliderdown_mouseup);
}
//
private function sliderdown_mouseup(eo:* = null):void {
_scrollpane.stopContinueDown();
_stage.removeEventListener(MouseEvent.MOUSE_UP, sliderdown_mouseup);
}
/** */
private function wheelscroll(eo:* = null):void {
if(eo.delta > 0) _scrollpane.scrollUp(.05);
else if(eo.delta < 0) _scrollpane.scrollDown(.05);
}
}
}
package {
import flash.display.*;
import flash.events.*;
public class NM_Scrollpane extends MovieClip {
//-------------------------------------------------------------------------------- Properties
private var _this:MovieClip;
private var _stage:Stage;
private var _parentmc:MovieClip;
//-------------------------------------------------------------------------------- Constractor
public function NM_Scrollpane() {
_this = this;
}
//-------------------------------------------------------------------------------- Function
/**
* initialize
*/
public function Init(setupargs:Object):void {
_stage = setupargs.stage;
_parentmc = setupargs.parentmc
setup(setupargs);
}
/**
* start
*/
public function Start():void {
}
/**
* reset
*/
public function Reset():void {
}
/**
* setup
*/
private function setup(setupargs:Object):void {
setup_scrolltarget(setupargs);
setup_sliderset(setupargs);
}
/**
* setup scrolltarget
*/
private var _scrolltarget:MovieClip;
private var _mask:MovieClip;
private var maskwid:Number;
private var maskhei:Number;
private var maskx:Number;
private var masky:Number;
private var scrolleaseval:Number;
private function setup_scrolltarget(setupargs:Object):void {
_scrolltarget = setupargs.scrolltarget;
maskwid = setupargs.maskwid;
maskhei = setupargs.maskhei;
maskx = setupargs.maskx;
masky = setupargs.masky;
_mask = new MovieClip();
var maskg:Graphics = _mask.graphics;
maskg.beginFill(0x000000, .2);
maskg.drawRect(maskx, masky, maskwid, maskhei);
maskg.endFill();
_this.addChild(_scrolltarget);
_this.addChild(_mask);
_scrolltarget.mask = _mask;
scrolleaseval = (setupargs.scrolleaseval) ? setupargs.scrolleaseval : 1;
if(scrolleaseval >= 1) scrolleaseval = 1;
else if(scrolleaseval <= .001) scrolleaseval = .001;
}
/**
* scrollaction
*/
private var doscroll:Boolean;
//
private function start_scrollaction():void {
if(doscroll) return;
doscroll = true;
_this.addEventListener(Event.ENTER_FRAME, scrollaction);
}
//
private function scrollaction(eo:* = null):void {
var goalposy = -scrollmax * _sliderset.SliderValue;
_scrolltarget.y += (goalposy - _scrolltarget.y) * scrolleaseval;
if(Math.abs(goalposy - _scrolltarget.y) <= 1) {
_scrolltarget.y = goalposy;
_this.removeEventListener(Event.ENTER_FRAME, scrollaction);
doscroll = false;
}
}
/**
* setup sliderset
*/
private var _sliderset:MovieClip;
private var _slider_grip:MovieClip;
private var _slider_base:MovieClip;
private var slidersize:Number;
private var scrollmax:Number;
private function setup_sliderset(setupargs:Object):void {
_sliderset = new NM_Sliderset();
_sliderset.x = setupargs.slidersetx;
_sliderset.y = setupargs.slidersety;
slidersize = setupargs.slidersize;
scrollmax = setupargs.scrollmax;
var args:Object = {};
args.stage = _stage;
args.parentmc = _this;
args.basesliderval = setupargs.basesliderval;
args.basesliderspeedup = setupargs.basesliderspeedup;
args.slidersize = slidersize;
_sliderset.Init(args);
_this.addChild(_sliderset);
_slider_grip = setupargs.slider_grip;
_slider_base = setupargs.slider_base;
if(_slider_grip) _sliderset.changeGrip(_slider_grip);
if(_slider_base) _sliderset.changeBase(_slider_base);
_sliderset.addEventListener("Progress", sliderset_progress);
}
/** */
private function sliderset_progress(eo:* = null) {
start_scrollaction();
}
/**
* set by ratio
*/
public function setSliderByRatio(ratio:Number):void {
_sliderset.setSliderByRatio(ratio);
}
/**
* scroll up
*/
public function scrollUp(upval:Number):void {
_sliderset.sliderUp(upval);
}
/**
* scroll down
*/
public function scrollDown(downval:Number):void {
_sliderset.sliderDown(downval);
}
/**
* continue scroll up
*/
public function startContinueUp(upval:Number, upmax:Number, speedup:Number):void {
_sliderset.startContinueUp(upval, upmax, speedup);
}
/** */
public function stopContinueUp():void {
_sliderset.stopContinueUp();
}
/**
* continue scroll down
*/
public function startContinueDown(upval:Number, upmax:Number, speedup:Number):void {
_sliderset.startContinueDown(upval, upmax, speedup);
}
/** */
public function stopContinueDown():void {
_sliderset.stopContinueDown();
}
}
}