スケールバーとスクロールバー
あと、もうちょっと詰める予定。
以外と大変ですね。あたまくらくらしています。
/**
* Copyright kawamura ( http://wonderfl.net/user/kawamura )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/nMBM
*/
package {
import flash.display.MovieClip;
public class Main extends MovieClip {
public function Main() {
// constructor code
var loader:XMLLoader = new XMLLoader();
loader.init(this);
}
public function initload_complete(xml:XML):void{
//public function initload_complete(data_ar:Array):void{
var body:Body=new Body();
addChild(body);
//body.init(data_ar);
body.init(xml);
}
}
}
class XMLLoader {
private var path:String ="data.xml";
private var main:Main;
public function XMLLoader() {
// constructor code
}
public function init(_main:Main):void{
main=_main;
var xml:XML = <data>
<month id="1">
<title color="0x00FF00" src="img/001.jpg">test</title>
<title color="0xFF0000" src="img/002.jpg">test</title>
<title color="0xFF0000" src="img/003.jpg">test</title>
</month>
<month id="2">
<title color="0xFF0000">test</title>
<title color="0x0000FF">test</title>
<title color="0xFF0000">test</title>
<title color="0x00FF00">test</title>
<title color="0xFF0000">test</title>
</month>
<month id="3">
<title color="0xFF0000">test</title>
<title color="0xFF0000">test</title>
</month>
<month id="4">
<title color="0x0000FF">test</title>
<title color="0xFF0000">test</title>
<title color="0x00FF00">test</title>
</month>
<month id="5">
<title color="0xFF0000">テキストです。</title>
</month>
<month id="6">
<title color="0xFF0000">testtesttesttesttesttest</title>
<title color="0x00FF00">test</title>
<title color="0x0000FF">test</title>
</month>
<month id="7">
<title color="0xFF0000" src="img/001.jpg">testtest</title>
<title color="0xFF00FF">testtesttest</title>
<title color="0x00FF00">test</title>
<title color="0x0000FF">test</title>
<title color="0x0000FF">test</title>
<title color="0xFF0000" src="img/002.jpg">test</title>
<title color="0xCC0000">test</title>
</month>
<month id="8">
<title color="0xFF00FF">test</title>
<title color="0xFF0000">test</title>
<title color="0x00FF00">test</title>
</month>
<month id="9">
<title color="0xFF0000">test</title>
<title color="0x0000FF">test</title>
<title color="0xFF0000">test</title>
<title color="0xFF0000">test</title>
<title color="0x0000FF">test</title>
</month>
<month id="10">
<title color="0xFF0000">test</title>
<title color="0x00FF00">test</title>
</month>
<month id="11">
<title color="0xFF0000">test</title>
<title color="0x0000FF">test</title>
<title color="0xFF0000">test</title>
</month>
<month id="12">
<title color="0xFF0000">test</title>
<title color="0xFF0000">test</title>
<title color="0x0000FF">test</title>
<title color="0xFF0000">test</title>
<title color="0xFF0000">test</title>
<title color="0xFF0000">test</title>
</month>
</data>
main.initload_complete(xml);
}
}
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Graphics;
import flash.events.MouseEvent;
class Body extends MovieClip {
private var slider:TimeSlider;
private var calendar:Calendar;
private var scrollbar:Scrollbar;
private var target_height:Number;
public function Body() {
// constructor code
}
public function init(xml:XML):void{
slider=new TimeSlider();
addChild(slider);
slider.init();
slider.x=30;
slider.y=400;
calendar = new Calendar();
addChild(calendar);
calendar.init(xml);
calendar.x=30;
calendar.y=30;
scrollbar=new Scrollbar();
addChild(scrollbar);
scrollbar.init();
scrollbar.x=30;
scrollbar.y=340
slider.setCalendar(calendar);
scrollbar.setCalendar(calendar);
calendar.setReferences(slider,scrollbar);
}
}
import flash.display.MovieClip;
import flash.display.Graphics;
import flash.display.Shape;
import flash.text.TextField;
import flash.events.Event;
class Calendar extends MovieClip {
//カレンダー位置
public var position:Number = 0;
//1ヶ月:0 6ヶ月:1 12ヶ月:2
public var type:uint=2;
//長さ
private var width_list:Array=new Array(30,60,360);
//
private var month_list:Vector.<Month>;
private var month_width:Number;
private var base:MovieClip;
private var slider:TimeSlider;
private var scrollbar:Scrollbar;
//
private var target_x:Number=0;
public function Calendar() {
// constructor code
}
public function init(xml:XML):void{
var i:uint;
var g:Graphics;
var waku:Shape=new Shape();
waku.graphics.lineStyle(2,0x000000);
waku.graphics.drawRect(0,0,360,300);
addChild(waku);
var mask_shape:Shape=new Shape();
g=mask_shape.graphics;
//g.lineStyle(2,0x000000);
g.beginFill(0x000000)
g.drawRect(0,0,360,300)
addChild(mask_shape);
base = new MovieClip();
addChild(base);
base.mask=mask_shape;
//
var red:MovieClip=new MovieClip();
red.graphics.beginFill(0xFF0000,0.6);
red.graphics.drawCircle(0,0,5)
red.y=-5;
red.x=0;
base.addChild(red);
//
var month:Month;
month_width=width_list[0];
month_list=new Vector.<Month>();
for(i=0;i<12;i++){
month = new Month();
month.x = month_width*i-month_width*6;
month.init( i , month_width , xml.month[i])
base.addChild(month);
month_list.push(month);
}
//
base.x=180;
addEventListener(Event.ENTER_FRAME,enter_frame);
}
public function resizePosition(value:Number):void{
if(value == 0){
position = 0;
scrollbar.resizePosition(0);
}else if(value==1){
if(type == 0){
position = 3 ;
}else if(type == 2){
position = position-3 ;
if(position<0){
position = 0;
}else if(position >6){
position = 6;
}
}
scrollbar.resizePosition(1);
}else if(value==2){
position = position+3 ;
scrollbar.resizePosition(2);
}
}
public function get barwidth():Number{
return month_width;
//return 360*360/(month_width*12);
}
public function get barx():Number{
return base.x ;
}
public function setReferences(_slider:TimeSlider,_scrollbar:Scrollbar):void{
slider=_slider;
scrollbar=_scrollbar;
}
private function enter_frame(event:Event):void{
var target_width:Number = width_list[slider.target_x/100];
var dw:Number=target_width-month_width;
month_width+=dw*0.6;
var g:Graphics;
var i:uint;
for(i=0;i<12;i++){
var month:Month = month_list[i];
month.resize_bg(month_width)
month.x= month_width*i-month_width*6;;
}
//
//trace(position)
target_x =-1 * month_width * position + month_width*6; ;
var dx:Number = target_x-base.x;
base.x+=dx*0.6;
}
}
import flash.display.MovieClip;
import flash.display.Graphics;
import flash.events.Event;
import flash.geom.Rectangle;
import flash.events.MouseEvent;
class TimeSlider extends MovieClip {
public var target_x:Number=0;
//
private var btn:MovieClip;
private var line:MovieClip;
private var dx:Number;
private var calendar:Calendar;
private var drag_flag:Boolean = false;
public function TimeSlider() {
// constructor code
}
public function init():void{
var g:Graphics;
line=new MovieClip();
addChild(line);
g=line.graphics;
g.lineStyle(3,0,1);
g.moveTo(0,0);
g.lineTo(200,0);
g.endFill();
g.moveTo(0,15);
g.lineTo(0,-15);
g.endFill();
g.moveTo(100,12);
g.lineTo(100,-12);
g.endFill();
g.moveTo(200,15);
g.lineTo(200,-15);
g.endFill();
btn=new MovieClip();
btn.x=0;
addChild(btn);
g=btn.graphics;
g.beginFill(0);
g.drawRoundRect(-10,-10,20,20,10,10);
btn.addEventListener(MouseEvent.MOUSE_DOWN,btn_mousedown);
btn.buttonMode=true;
}
public function setCalendar(_calendar:Calendar):void{
calendar=_calendar;
addEventListener(Event.ENTER_FRAME,calendar_enterframe);
}
private function calendar_enterframe(event:Event):void{
if(drag_flag){
if(this.mouseX<50){
if(target_x != 0){
setPosition(0);
}
calendar.type = 0;
target_x=0;
}else if(this.mouseX < 150){
if(target_x != 100){
setPosition(1);
}
calendar.type = 1;
target_x=100;
}else{
if(target_x != 200){
setPosition(2);
}
calendar.type = 2;
target_x=200;
}
var dx:Number=target_x-btn.x;
btn.x+=dx*0.7;
}
}
private function setPosition( value:Number):void{
calendar.resizePosition(value)
}
private function btn_mousedown(event:Event):void{
//var btn:MovieClip=MovieClip(event.currentTarget);
stage.addEventListener(MouseEvent.MOUSE_UP,btn_mouseup);
btn.alpha=0.6;
drag_flag = true;
}
private function btn_mouseup(event:Event):void{
//btn.stopDrag();
stage.removeEventListener(MouseEvent.MOUSE_UP,btn_mouseup);
btn.alpha=1.0
drag_flag = false;
}
}
import flash.display.MovieClip;
import flash.display.Graphics;
import flash.display.Shape;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Rectangle;
class Scrollbar extends MovieClip{
private var bar:MovieClip;
private var target_x:Number = 180;
private var calendar:Calendar;
private var drag_flag:Boolean=false;
private var drag_x:Number = 0;
private var bar_x:Number=0
public function Scrollbar() {
// constructor code
}
public function init():void{
var g:Graphics;
var bg:Shape=new Shape();
addChild(bg);
g=bg.graphics;
g.lineStyle(2,0x000000);
g.drawRect(0,0,360,20);
}
public function setCalendar(_calendar:Calendar):void{
calendar = _calendar;
//
bar=new MovieClip();
addChild(bar);
var bar_width:Number=360*360/(calendar.barwidth*12);
bar.x=bar_width*0.5;
setBarWidth(bar_width);
bar.buttonMode = true;
bar.addEventListener(MouseEvent.MOUSE_DOWN,bar_mousedown);
/*
var red:MovieClip=new MovieClip();
red.graphics.beginFill(0xFF0000,0.6);
red.graphics.drawCircle(0,0,5)
red.y=-5;
red.x=0;
bar.addChild(red);
*/
//
addEventListener(Event.ENTER_FRAME,enterframe);
}
public function resizePosition(value:Number):void{
var bar_width:Number;
var d_width:Number;
if(value==0){
bar_width = 360;
target_x = bar_width*0.5;;
}else if(value == 1){
bar_width = 360*360/(60*12);
d_width = (360-bar_width)/6;
target_x= calendar.position * d_width+bar_width*0.5;
}else if(value == 2){
bar_width = 360*360/(360*12);
d_width = (360-bar_width)/12;
target_x= calendar.position * d_width+bar_width*0.5;
}
setBarWidth(bar_width);
}
private function enterframe(event:Event):void{
var bar_width:Number=360*360/(calendar.barwidth*12);
var d_width:Number;
var i:uint;
if(drag_flag){
if(calendar.type == 0){
target_x = bar_width*0.5;
}else if(calendar.type==1){
d_width = (360-bar_width)/6;
for(i=0 ; i<7 ;i++){
if( bar_x +(this.mouseX-drag_x) < (0.5+i)*d_width + bar_width*0.5){
target_x=i*d_width+bar_width*0.5;
calendar.position = i;
break;
}
}
}else if(calendar.type==2){
d_width = (360-bar_width)/11;
for(i=0 ; i<12 ;i++){
if( bar_x +(this.mouseX-drag_x) < (0.5+i)*d_width + bar_width*0.5){
target_x=i*d_width+bar_width*0.5;
calendar.position = i;
break;
}
}
}
}
//bar.x=target_x
var dx:Number=target_x-bar.x;
bar.x+=dx*0.5;
setBarWidth(bar_width);
}
private function bar_mousedown(event:MouseEvent):void{
drag_x = this.mouseX;
bar_x = target_x;
drag_flag=true;
//
/*
var rect:Rectangle=new Rectangle(0,0,360-bar.width,0);
bar.startDrag(false,rect);
*/
stage.addEventListener(MouseEvent.MOUSE_UP,bar_mouseup);
}
private function bar_mouseup(event:MouseEvent):void{
drag_flag=false;
//bar.stopDrag();
stage.removeEventListener(MouseEvent.MOUSE_UP,bar_mouseup);
}
private function setBarWidth(bar_width:Number):void{
var g:Graphics=bar.graphics;
g.clear();
g.beginFill(0x000000);
g.drawRect(bar_width*-0.5,0,bar_width,20);
}
}
import flash.display.MovieClip;
import flash.text.TextField;
import flash.display.Graphics;
class Month extends MovieClip{
private var bg_mc:MovieClip;
private var bg_g:Graphics;
private var masu_list:Vector.<Masu>;
private var width_list:Array=[30-4,60-4,360-4]
public function Month() {
// constructor code
}
public function init(number:Number,month_width:Number , xml:XML):void{
bg_mc = new MovieClip();
addChild(bg_mc);
bg_g = bg_mc.graphics;
bg_g.lineStyle(1,0);
bg_g.beginFill(0xCCCCCC,0.5);
bg_g.drawRect(0,0,month_width,300);
addChild(bg_mc);
var tf:TextField=new TextField();
addChild(tf);
tf.text=String(number+1);
//
var masu:Masu;
var i:uint;
var n:Number = xml.title.length();
masu_list =new Vector.<Masu>();
var g:Graphics;
var masu_width:Number=month_width-4;
for (i=0 ; i<n ; i++){
masu=new Masu();
addChild(masu);
var color:Number = Number(xml.title[i].@color);
var title_string:String=String(xml.title[i]);
masu.init(masu_width,color,title_string);
masu.x=2;
masu.y=300-(month_width * (i+1))+2;
masu_list.push(masu);
}
}
public function resize_bg(month_width:Number):void{
bg_g.clear();
bg_g = bg_mc.graphics;
bg_g.lineStyle(1,0);
bg_g.beginFill(0xCCCCCC,0.5);
bg_g.drawRect(0,0,month_width,300);
var masu:Masu;
var g:Graphics;
var i:uint;
var n:Number = masu_list.length;
var masu_width:Number=month_width-4;
for (i=0 ; i<n ; i++){
masu = masu_list[i];
masu.resize_bg(masu_width);
}
}
}
import flash.display.MovieClip;
import flash.display.Graphics;
import flash.text.TextField;
import flash.display.BitmapData;
import flash.display.Bitmap;
class Masu extends MovieClip{
private var bg_mc:MovieClip=new MovieClip();
private var mask_mc:MovieClip;
private var mask_g:Graphics
private var g:Graphics;
private var _color:Number;
private var tf_mc:MovieClip
public function Masu() {
// constructor code
}
public function init(masu_width:Number, color:Number,value:String):void{
_color =color;
//
mask_mc = new MovieClip();
addChild(mask_mc);
mask_g = mask_mc.graphics;
mask_g.beginFill(0xFF0000);
mask_g.drawRect(0,0,masu_width,26)
this.mask=mask_mc;
//
bg_mc=new MovieClip();
addChild(bg_mc);
g=bg_mc.graphics;
g.beginFill(_color);
g.drawRect(0,0,masu_width,26);
tf_mc = new MovieClip();
addChild(tf_mc);
var tf:TextField=new TextField();
tf.text=value;
tf.width=tf.textWidth+4;
tf.height=tf.textHeight+5;
var bmd:BitmapData=new BitmapData(tf.width,tf.height,true,0xFFFFFF);
bmd.draw(tf,null,null,null,null,true);
var bm:Bitmap=new Bitmap(bmd,"auto",true);
tf_mc.addChild(bm)
bm.x = tf.width * -0.5;
if(tf_mc.width>masu_width){
tf_mc.x=tf_mc.width*0.5;
}else{
tf_mc.x=masu_width*0.5;
}
}
public function resize_bg(value:Number):void{
mask_g.clear();
mask_g.beginFill(0xFF0000);
mask_g.drawRect(0,0,value,26)
//
g.clear();
g.beginFill(_color);
g.drawRect(0,0,value,26);
if(tf_mc.width>value){
tf_mc.x=tf_mc.width*0.5;
}else{
tf_mc.x=value*0.5;
}
}
}