ツールチップつきマーク
場所を指定するのに使えるかも知れない部品
/**
* Copyright hi.kurosawa ( http://wonderfl.net/user/hi.kurosawa )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/7874
*/
package {
//----------------------------------------------
//ツールチップつきマークTEST
// http://programmingatelier.net/
//----------------------------------------------
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.display.StageScaleMode;
import flash.display.StageAlign;
//import cls.*;
public class testToolTipMark extends Sprite {
private var cMess:clsText;
public function testToolTipMark() {
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
//下の2行を加えるとHTMLで定義したサイズで表示
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
var w:int = stage.stageWidth;
var h:int = stage.stageHeight;
addChild(new clsText("赤い丸をクリックして下さい", w/2-100, 100, 200, 20));
addChild(new clsToolTipMark("MK-1", 10, 10, 5, "MK-1:説明文", 0xff0000, fncMkClick));
addChild(new clsToolTipMark("MK-2", 10, h/2, 5, "MK-2:説明文", 0xff0000, fncMkClick));
addChild(new clsToolTipMark("MK-3", 10, h-10, 5, "MK-3:説明文", 0xff0000, fncMkClick));
addChild(new clsToolTipMark("MK-4", w/2, h-10, 5, "MK-4:説明文", 0xff0000, fncMkClick));
addChild(new clsToolTipMark("MK-5", w-10, h-10, 5, "MK-5:説明文", 0xff0000, fncMkClick));
addChild(new clsToolTipMark("MK-6", w-10, h/2, 5, "MK-6:説明文", 0xff0000, fncMkClick));
addChild(new clsToolTipMark("MK-7", w-10, 10, 5, "MK-7:説明文", 0xff0000, fncMkClick));
addChild(new clsToolTipMark("MK-8", w/2, 10, 5, "MK-8:説明文", 0xff0000, fncMkClick));
addChild(new clsToolTipMark("MK-9", w/2, h/2+50, 5, "MK-9:説明文\n重なりTEST", 0xff0000, fncMkClick));
addChild(new clsToolTipMark("MK-10", w/2+20, h/2+70, 5, "MK-10:説明文\n重なりTEST", 0xff0000, fncMkClick));
addChild(new clsToolTipMark("MK-11", w/2, h/2+90, 5, "MK-11:説明文\n重なりTEST", 0xff0000, fncMkClick));
addChild(new clsToolTipMark("MK-12", w/2-20, h/2+70, 5, "MK-12:説明文\n重なりTEST", 0xff0000, fncMkClick));
}
private function fncMkClick(mk:clsToolTipMark):void {
clsAlert.show(root,mk.name + "をクリックしました", "ツールチップつきマークTEST");
}
}
}
//========================================
//package cls {
//----------------------------------------------
//ツールチップつきマーク
// http://programmingatelier.net/
//----------------------------------------------
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.geom.Point;
// public class clsToolTipMark extends Sprite {
class clsToolTipMark extends Sprite {
public var strTip:String;
public var intX0:int;
public var intY0:int;
public var intR:int;
public var uinCol:uint;
public var fncClick:Function;
public var tfTip:TextField;
//ツールチップつきマーククラス
// nam:名称
// x0,y0:表示位置
// r:マーク半径
// sTip:ツールチップ文字列
// uCol:マークのカラー
// fClick:クリックしたときコールされる関数
public function clsToolTipMark(nam:String, x0:int, y0:int, r:int
,sTip:String, uCol:uint=0xff0000,fClick:Function = null) {
name = nam;
strTip=sTip;
intX0=x0;
intY0=y0;
intR=r;
uinCol=uCol;
fncClick=fClick;
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
// 円を描く (中を塗りつぶす)
graphics.lineStyle(1, uinCol);
graphics.beginFill(uinCol);
graphics.drawCircle(intX0, intY0, intR);
graphics.endFill();
tfTip = fncText(strTip, intX0, intY0);
addChild(tfTip);
tfTip.visible = false;
this.addEventListener(MouseEvent.CLICK, onClick);
this.addEventListener(MouseEvent.MOUSE_OVER,onOver);
this.addEventListener(MouseEvent.MOUSE_OUT,onOut);
}
// 固定文字文字列表示関数
// sText:表示文字列
// nx,ny:文字位置
// 戻り値:作成TextField
private function fncText(sText:String , nx:int, ny:int):TextField {
var tf:TextField = new TextField();
tf.autoSize = TextFieldAutoSize.LEFT;
tf.text = sText;
tf.x = nx+5;
tf.y = ny+5;
tf.selectable = false;
tf.border = true;
tf.borderColor = 0xbbbbbb;
tf.background = true;
tf.backgroundColor = 0xdddddd;
return tf;
}
//クリック時
private function onClick(e:MouseEvent):void {
if(fncClick!=null){fncClick(this);}
}
// ツールチップの表示
private function onOver(e:MouseEvent):void {
var l_pos : Point = new Point(intX0,intY0);
var g_pos : Point = this.localToGlobal(l_pos);
var intX:int = g_pos.x;
var intY:int = g_pos.y;
//一番前に表示
parent.setChildIndex(this, parent.numChildren - 1);
//ツールチップを領域外にならないように表示
if (intX + intR + 5 + tfTip.width > root.stage.stageWidth) {
intX = intX - intR - 5 - tfTip.width;
} else {
intX = intX + intR + 5;
}
if (intY + intR + 5 + tfTip.height > root.stage.stageHeight) {
intY = intY - intR - 5 - tfTip.height;
} else {
intY = intY + intR + 5;
}
g_pos.x = intX;
g_pos.y = intY;
l_pos = this.globalToLocal(g_pos);
tfTip.x = l_pos.x;
tfTip.y = l_pos.y;
tfTip.visible = true;
}
private function onOut(e:MouseEvent):void {
tfTip.visible = false;
}
}
//}
//=========================================
//package cls {
//----------------------------------------------
//Alertクラス
// http://programmingatelier.net/
//----------------------------------------------
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.Event;
import flash.events.MouseEvent;
// public class clsAlert {
class clsAlert {
private static var spPar:Object; //親(root)
private static var spBack:Sprite; //モーダルのための領域
private static var spMain:Sprite; //Alertのエリア
//Alertの移動用
public static var blMouseFlg:Boolean = false;
public static var intMouseX:int;
public static var intMouseY:int;
//Alertのサイズ
public static var intW:int;
public static var intH:int;
//ボタンの押されたときの関数
public static var fncBtn:Function;
//ボタンの列挙型
public static const YES:uint = 0x0001;
public static const NO:uint = 0x0002;
public static const OK:uint = 0x0004;
public static const CANCEL:uint = 0x0008;
//----------------------------------------------------------------------------
// Alertを表示
// clsAlert.show(root,"メッセージ", "タイトル",clsAlert.YES|clsAlert.NO,cloFnc);
// par:親(rootを指定)
// text:メッセージ(改行も対応)
// title:タイトル
// flags:表示するボタン(YES/NO/OK/CANCEL)
// cloFnc:ボタンが押されたとき実行する関数(cloFnc(ui:uint):void)が押されたボタンの値
public static function show(par:Object, text:String = "", title:String = "",
flags:uint = OK, cloFnc:Function = null):void {
fncBtn = cloFnc;
// rootのサイズ
spPar = par;
var iWid:int = spPar.stage.stageWidth;
var iHei:int = spPar.stage.stageHeight;
// モーダルにするために四角を書く
spBack=new Sprite();
spBack.graphics.beginFill(0xffffff,0.5);
spBack.graphics.lineStyle(1,0xffffff,0.5);
spBack.graphics.drawRect(0, 0, spPar.stage.stageWidth, spPar.stage.stageHeight);
// Alertの各部品を配置するエリア
spMain = new Sprite();
spPar.addChild(spBack);
spBack.addChild(spMain);
//タイトルを配置
var tfTit:TextField = new TextField();
tfTit.autoSize = "left";
tfTit.text = title;
tfTit.selectable = false;
var idx:int = tfTit.width; //Alertの大きさ
var idy:int = 20;
spMain.addChild(tfTit);
//メッセージを配置
var tfMes:TextField = new TextField();
tfMes.multiline = true;
tfMes.autoSize = "left";
tfMes.text = text;
tfMes.selectable = false;
if(idx< tfMes.width+4) {idx= tfMes.width+4;}
idy += tfMes.height+4;
spMain.addChild(tfMes);
tfMes.y = 22;
tfMes.x = 2;
//ボタンの配置
var ibx:int = 20;
if ((flags & YES) != 0x0000) {ibx += 65;}
if ((flags & NO) != 0x0000) {ibx += 65;}
if ((flags & OK) != 0x0000) {ibx += 65;}
if ((flags & CANCEL) != 0x0000) {ibx += 65;}
ibx += 20-10;
if (ibx > idx) {
idx = ibx;
ibx = 20;
} else {
ibx = 20 + (idx - ibx) / 2;
}
if ((flags & YES) != 0x0000) {
spMain.addChild(new clsButton("YES", "YES" , ibx, idy, 55, 20 , fncBtnOn));
ibx += 65;
}
if ((flags & NO) != 0x0000) {
spMain.addChild(new clsButton("NO", "NO" , ibx, idy, 55, 20 , fncBtnOn));
ibx += 65;
}
if ((flags & OK) != 0x0000) {
spMain.addChild(new clsButton("OK", "OK" , ibx, idy, 55, 20 , fncBtnOn));
ibx += 65;
}
if ((flags & CANCEL) != 0x0000) {
spMain.addChild(new clsButton("CANCEL", "CANCEL" , ibx, idy, 55, 20 , fncBtnOn));
ibx += 65;
}
idy += 25;
//Alertの外形
spMain.graphics.beginFill(0xffffff);
spMain.graphics.lineStyle(1,0x000000);
spMain.graphics.drawRect(0, 0, idx, idy);
spMain.x = int((iWid - idx) / 2);
spMain.y = int((iHei - idy) / 2);
//タイトルの外形
tfTit.autoSize = "none";
tfTit.width = idx;
tfTit.height = 20;
tfTit.border = true;
tfTit.background = true;
tfTit.backgroundColor = 0xbbbbbb;
//MOUSE_DOWN以外はstageを付ける
tfTit.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
tfTit.stage.addEventListener(MouseEvent.MOUSE_MOVE,onMove);
tfTit.stage.addEventListener(MouseEvent.MOUSE_UP,onUp);
intW = idx;
intH = idy;
}
//Alertのドラッグによる移動
private static function onDown(e:MouseEvent):void {
blMouseFlg = true;
intMouseX=spPar.mouseX;
intMouseY=spPar.mouseY;
}
private static function onMove(e:MouseEvent):void {
if(e.buttonDown==false) {blMouseFlg = false;}
if (blMouseFlg == true) {
var x1:int = spPar.mouseX;
var y1:int = spPar.mouseY;
var x2:int=spMain.x + x1 - intMouseX ;
var y2:int=spMain.y + y1 - intMouseY ;
fncChkXY(x2,y2);
intMouseX = x1;
intMouseY = y1;
}
}
private static function onUp(e:MouseEvent):void {
blMouseFlg = false;
}
//Alertが領域外に出ないようにする
private static function fncChkXY(x1:int,y1:int):void {
if (x1 > spPar.stage.stageWidth - intW-1) { x1 = spPar.stage.stageWidth - intW-1; }
if (y1 > spPar.stage.stageHeight - intH-1) { y1 = spPar.stage.stageHeight - intH-1; }
if (x1 < 0) { x1 = 0; }
if (y1 < 0) { y1 = 0; }
spMain.x=x1;
spMain.y=y1;
}
//ボタンが押されたときの処理===============================
private static function fncBtnOn(btn:clsButton):void {
spPar.removeChild(spBack); //Alertの削除
spBack = null;
spMain = null;
if (fncBtn != null) { //呼び出し側の関数を実行
if (btn.name == "YES") { fncBtn(YES); }
if (btn.name == "NO") { fncBtn(NO); }
if (btn.name == "OK") { fncBtn(OK); }
if (btn.name == "CANCEL") { fncBtn(CANCEL); }
}
}
}
//}
//===========================================
//package cls {
//----------------------------------------------
//ボタンクラス:TextFieldをボタンのように使う
// 長押し(LongPress)の対応
// http://programmingatelier.net/
//----------------------------------------------
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.ui.MouseCursor;
import flash.ui.Mouse;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
import flash.utils.getTimer;
//public class clsButton extends TextField {
class clsButton extends TextField {
private var tfFormat:TextFormat;
private var fncChkFnc:Function;
private var fncLongPress:Function;
private var intTim:int;
//ボタンクラス:TextFieldをボタンのように使う
// nam:ボタンの名称(ボタンを区別するために使用)
// sText:表示する文字
// nX,nY:表示位置
// nWidth,nHeight:ボタンのサイズ
// fChk:クリックしたときの関数「fChk(b:clsButton):void」
// fLongPress:ボタンの長押ししたときの関数「fLongPress(b:clsButton):void」
// bItalic:ボタンの文字をItalicにするか?
public function clsButton(nam:String,sText:String ,
nX:Number, nY:Number, nWidth:Number, nHeight:Number , fChk:Function=null,
fLongPress:Function = null, bItalic:Boolean = false) {
name = nam;
this.text = sText;
this.x = nX;
this.y = nY;
this.width = nWidth;
this.height = nHeight;
this.border = true;
this.borderColor = 0x000000;
this.background = true;
this.backgroundColor = 0xcccccc;
this.textColor = 0x000000;
this.selectable = false; //ボタンの表示文字は選択不可
tfFormat = new TextFormat();
tfFormat.align = TextFormatAlign.CENTER;
tfFormat.italic = bItalic;
this.setTextFormat(tfFormat);
//マウスがのった時の色の変更
this.addEventListener(MouseEvent.ROLL_OVER, onOver);
this.addEventListener(MouseEvent.ROLL_OUT, onOut);
//クリック時の処理
fncChkFnc = fChk;
if(fncChk!=null) {this.addEventListener(MouseEvent.CLICK, fncChk);}
//長押し時の処理
fncLongPress = fLongPress;
if (fncLongPress != null) {
this.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
this.addEventListener(MouseEvent.MOUSE_UP, onUp);
}
this.enable(true); //ボタンを有効に
}
//表示文字の変更
// sText:表示する文字
public function setText(sText:String):void {
this.text = sText;
this.setTextFormat(tfFormat);
}
//ボタンの有効(bflg=true)・無効(bflg=false)
public function enable(bflg:Boolean):void {
this.mouseEnabled = bflg;
if (bflg == true) { this.alpha = 1.0; }
else {this.alpha = 0.5;}
}
//マウスオーバー処理(ボタンらしく見せる)
public function onOver(e:MouseEvent):void {
e.target.backgroundColor = 0xaaaaaa;
//Mouse.cursor=flash.ui.MouseCursor.HAND;
}
public function onOut(e:MouseEvent):void {
e.target.backgroundColor = 0xcccccc;
//Mouse.cursor=flash.ui.MouseCursor.ARROW;
}
//長押し(LongPress)の対応
public function onDown(e:MouseEvent):void {
intTim = getTimer();
this.addEventListener(Event.ENTER_FRAME, onLongPress);
}
public function onUp(e:MouseEvent):void {
this.removeEventListener(Event.ENTER_FRAME, onLongPress);
}
public function onLongPress(e:Event):void {
//ボタンを押し続けて0.5秒以上たったら長押し
if (intTim < getTimer() - 500) { fncLongPress(this); }
}
//クリック
public function fncChk(e:Event):void {
fncChkFnc(this);
}
}
//}
//===========================================
//package cls {
//----------------------------------------------
//テキストの表示クラス
// http://programmingatelier.net/
//----------------------------------------------
import flash.text.TextField;
//public class clsText extends TextField {
class clsText extends TextField {
//テキストの表示クラス
// sText:表示する文字
// nX,nY:表示位置
// nWidth,nHeight:表示するサイズ
// bBorder:外枠の有無
public function clsText(sText:String ,
nX:Number, nY:Number, nWidth:Number, nHeight:Number ,bBorder:Boolean=false) {
this.text = sText;
this.x = nX;
this.y = nY;
this.width = nWidth;
this.height = nHeight;
this.border = bBorder;
this.background = bBorder;
}
}
//}