チェンジセット 1643
- コミット日時:
- 2008/10/17 04:19:47 (3 ヶ月前)
- ファイル:
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
mxp/specialbutton/as3/src/n_mattun/display/SpecialButton.as
r1626 r1643 4 4 import flash.geom.*; 5 5 import flash.text.TextField; 6 import flash.text.TextFormat; 6 7 import flash.display.DisplayObject; 7 8 import flash.display.Shape; … … 69 70 private var focusListener :FocusManager; 70 71 private var repeatTimer :Timer = new Timer(0,0); 72 private var toolTip_txt :TextField; 73 private var toolTipTimer :Timer = new Timer(600,1); 74 private var isToolTipHandle :Boolean = false; 71 75 72 76 public var __w :Number = 80; … … 83 87 public var __bgAlpha :Number = 100; 84 88 public var __labelAlpha :Number = 100; 85 public var __data :Array = [ true];89 public var __data :Array = []; 86 90 public var __actionType :String = "ハンドラ起動"; 87 91 public var __enabled :Boolean= true; 88 92 public var __useHandCursor :Boolean= true; 89 93 public var __pushPixel :Number = 1; 94 public var __sizeChangePoint:String = "左上"; 95 public var __toolTip :String = ""; 90 96 91 97 //ハンドラ郡 … … 115 121 _vw = __w; 116 122 _vh = __h; 123 //コンストラクタ引数のパスを親として自分をaddChildする 117 124 args[0].addChild(this); 118 125 }else{ … … 152 159 this.labelPosition = __labelPosition; 153 160 this.pushPixel = __pushPixel; 154 161 this.data = __data; 162 this.sizeChangePoint= __sizeChangePoint; 163 this.toolTip = __toolTip; 164 this.repeat = __repeat; 155 165 //テスト用 156 //this.__upView.handler = "stopDrag"; 157 //this.__overView.handler = "BorderBox_bb.width"; 158 //this.__downView.handler = "startDrag"; 159 //this.__disableView.handler = "ButtonBox_box.width"; 160 161 __shortCutKey = "shift+a"; 162 repeat = 500;//ボタン押しっぱで連続ハンドラ起動する場合のリピート間隔(0の場合はリピートなし) 163 166 //this.__upView.handler = "upHandler"; 167 //this.__overView.handler = "overHandler"; 168 //this.__downView.handler = "downHandler"; 169 //this.__disableView.handler = "disableHandler"; 164 170 //ショートカットキーを設定しておく 165 171 scDownListener = new ShortCutListener(this,"shortCutDownHandler",__shortCutKey,"down",0,0); 166 172 scUpListener = new ShortCutListener(this,"shortCutUpHandler" ,__shortCutKey,"up",0,0); 167 168 this.__initHandler = "initHandler"; 169 this.__clickHandler = "initHandler"; 170 this.__dbClickHandler = "initHandler"; 171 this.shortCutKey = __shortCutKey; 172 173 174 this.initHandler = __initHandler; 175 this.clickHandler = __clickHandler; 176 this.dbClickHandler = __dbClickHandler; 177 this.shortCutKey = __shortCutKey; 173 178 174 179 this.buttonMode = true; … … 176 181 this.mouseChildren = false;//子インスタンスのイベント検知有無 177 182 this.doubleClickEnabled = true;//ダブルクリックイベントの検知可否 178 179 this.useHandCursor = __useHandCursor;180 183 181 184 this.enabled = __enabled; … … 440 443 public override function set width(_num:Number):void { 441 444 if(autoSize == false){ 445 var _abs = _num-__w;//変化量を取得しておく 442 446 __w = _num; 443 447 mask_mc.width = __w-outerSize*2; … … 446 450 innerPosition = __innerPosition; 447 451 cornerPart = __cornerPart; 452 //変化量に応じてボタン本体のx位置を更新する 453 updateXYposition("x",_abs); 448 454 } 449 455 } … … 451 457 public override function set height(_num:Number):void { 452 458 if(autoSize == false){ 459 var _abs = _num-__h;//変化量を取得しておく 453 460 __h = _num; 454 461 body_mc.height = __h; … … 457 464 innerPosition = __innerPosition; 458 465 cornerPart = __cornerPart; 466 //変化量に応じてボタン本体のx位置を更新する 467 updateXYposition("y",_abs); 459 468 } 460 469 } … … 506 515 var i=0; 507 516 for(i=0;i < _params.length;i++){ 508 __data[i] = _params[i]; 517 //セットされたデータは評価して突っ込む 518 trace("評価前:",_params[i]); 519 __data[i] = dataStrToPath(_params[i]); 520 trace("評価後:",__data[i]); 509 521 } 510 522 } … … 638 650 __shortCutKey = _str; 639 651 scDownListener.shortCutKey = _str; 640 scUpListener.shortCutKey = _str;652 scUpListener.shortCutKey = _str; 641 653 } 642 654 // -------------------------------------------------------------------// … … 652 664 } 653 665 } 666 // -------------------------------------------------------------------// 667 //[Inspectable(defaultValue="", name="28.ダブルクリックハンドラ名", type="String")] 668 public override function set useHandCursor(_bool:Boolean):void { 669 __useHandCursor = _bool; 670 super.useHandCursor = _bool; 671 } 672 // -------------------------------------------------------------------// 673 //[Inspectable(defaultValue="", name="28.ダブルクリックハンドラ名", type="String")] 674 public function set sizeChangePoint(_str:String):void { 675 __sizeChangePoint = _str; 676 } 677 // -------------------------------------------------------------------// 678 //[Inspectable(defaultValue="", name="28.ダブルクリックハンドラ名", type="String")] 679 public function set toolTip(_str:String):void { 680 __toolTip = _str; 681 if(_str == ""){ 682 if(isToolTipHandle == true){ 683 removeEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler); 684 toolTipTimer.removeEventListener(TimerEvent.TIMER, toolTipTimerHandler); 685 isToolTipHandle = false; 686 } 687 }else{ 688 if(isToolTipHandle == false){ 689 addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler); 690 toolTipTimer.addEventListener(TimerEvent.TIMER, toolTipTimerHandler); 691 isToolTipHandle = true; 692 } 693 } 694 } 654 695 // ===================================================================// 655 696 // getter … … 910 951 public function get repeat():uint { 911 952 return __repeat; 953 } 954 // -------------------------------------------------------------------// 955 public override function get useHandCursor():Boolean { 956 return __useHandCursor; 957 } 958 // -------------------------------------------------------------------// 959 public function get sizeChangePoint():String { 960 return __sizeChangePoint; 961 } 962 // -------------------------------------------------------------------// 963 public function get toolTip():String { 964 return __toolTip; 912 965 } 913 966 // ===================================================================// … … 1188 1241 _obj = __upView; 1189 1242 btnStatus = "out"; 1243 deleteToolTip();//ツールチップがあったら消しておく 1190 1244 if(repeat != 0) repeatTimer.stop(); 1191 1245 break; … … 1278 1332 private function btnClickHandler(e:*):void { 1279 1333 trace("---------------btnClickHandler",actionType); 1334 //ツールチップが表示されていたらここで消す 1335 deleteToolTip(); 1280 1336 1281 1337 var _array:Array = new Array(2); … … 1293 1349 1294 1350 switchHandler(_objPath,_objProp); 1295 /*1296 //repeatが0の場合は速攻魔法発動1297 if(repeat == 0){1298 switchHandler(_objPath,_objProp);1299 }else{1300 //違う場合はTimer経由でずっと俺のタ(ry1301 repeatTimer.start();1302 }1303 */1304 1351 } 1305 1352 // -------------------------------------------------------------------// … … 1402 1449 trace("---------------btnUpHandler",actionType); 1403 1450 1451 //音を鳴らす 1452 playLinkSound(__upView.sound); 1453 1404 1454 var _array:Array = new Array(2); 1405 1455 var _objPath:* = this.parent; … … 1424 1474 return; 1425 1475 } 1426 1427 //音を鳴らす1428 playLinkSound(__upView.sound);1429 1476 } 1430 1477 // -------------------------------------------------------------------// … … 1432 1479 private function btnOverHandler(e:*):void { 1433 1480 trace("---------------btnOverHandler",e.target.parent.name,e.target.name); 1481 1482 //音を鳴らす 1483 playLinkSound(__overView.sound); 1434 1484 1435 1485 var _array:Array = new Array(2); … … 1455 1505 return; 1456 1506 } 1457 1458 //音を鳴らす1459 playLinkSound(__overView.sound);1460 1507 } 1461 1508 // -------------------------------------------------------------------// … … 1464 1511 trace("---------------\nbtnDownHandler"); 1465 1512 1513 //音を鳴らす 1514 playLinkSound(__downView.sound); 1515 1466 1516 var _array:Array = new Array(2); 1467 1517 var _objPath:* = this.parent; … … 1486 1536 return; 1487 1537 } 1488 1489 //音を鳴らす1490 playLinkSound(__downView.sound);1491 1538 } 1492 1539 // -------------------------------------------------------------------// … … 1494 1541 private function btnDisableHandler(e:*):void { 1495 1542 trace("---------------\nbtnDisableHandler"); 1543 1544 //音を鳴らす 1545 playLinkSound(__disableView.sound); 1496 1546 1497 1547 var _array:Array = new Array(2); … … 1517 1567 return; 1518 1568 } 1519 1520 //音を鳴らす1521 playLinkSound(__disableView.sound);1522 1569 } 1523 1570 // -------------------------------------------------------------------// … … 1582 1629 // -------------------------------------------------------------------// 1583 1630 //オブジェクト文字列を分割してターゲットパスとプロパティに分割する 1584 private function getHandlerTargetPath(_str:String):Array { 1585 var _array:* = new Array(); 1586 var _rPath:* = this.parent; 1587 var i = 0; 1588 //まず.で区切る 1589 _array = _str.split("."); 1590 //区切った文字列を順次パスとしてプッシュ 1591 for(i=0;i<_array.length-1;i++){ 1592 trace(_rPath,_array[i]); 1593 switch(_array[i]){ 1594 case "this": 1595 break; 1596 case "root": 1597 _rPath = root; 1598 break; 1599 case "parent": 1600 _rPath = _rPath.parent; 1601 break; 1602 default: 1603 _rPath = _rPath[_array[i]]; 1631 private function dataStrToPath(_obj:*):* { 1632 //文字列の場合は・・・ 1633 if(_obj is String){ 1634 //数値に変換できるものはuintにキャストして返す 1635 if(isNaN(_obj) == false) return uint(_obj); 1636 //Booleanに変換できるものはtrue/falseにして返す 1637 if(_obj == "true") return true; 1638 if(_obj == "false") return false; 1639 //ブランクもそのまま返す 1640 if(_obj == "") return ""; 1641 //文字列にドットがない場合は文字列そのものとして返す 1642 if(_obj.indexOf(".") < 0){ 1643 return _obj; 1644 }else{ 1645 //ドットが『\.』の場合は文字列として見なして返してしまう。 1646 if(_obj.indexOf("\\.") > 0) return _obj; 1647 //そうじゃない場合はパスと見なして評価して返す 1648 var _array:Array = new Array(2); 1649 var _objPath:* = this.parent; 1650 var _objProp:String = ""; 1651 //ハンドラ文字列をパスとプロパティに分割する 1652 _array = splitHandlerPath(_obj); 1653 _objPath = _array[0]; 1654 _objProp = _array[1]; 1655 //分割したパスをそのまま返す 1656 return _objPath[_objProp]; 1604 1657 } 1605 1658 } 1606 return [_rPath,_array[_array.length-1]]; 1659 //nullとundefinedはぬるぽ防止にブランクを返しておく 1660 if(_obj == null) return ""; 1661 if(_obj == undefined) return ""; 1662 //ここまで総スルーの場合はリファレンスオブジェクト系か 1663 //そのまま返せるものなのでそのまま返す 1664 return _obj; 1607 1665 } 1608 1666 // -------------------------------------------------------------------// … … 1650 1708 } 1651 1709 // -------------------------------------------------------------------// 1710 //ボタンのxy表示位置を更新する 1711 private function updateXYposition(xy:String,_abs:Number):void { 1712 1713 switch(sizeChangePoint){ 1714 case "左上" : 1715 case "LT" : 1716 return; 1717 break; 1718 case "上" : 1719 case "top" : 1720 if(xy == "x") this.x -= (_abs / 2); 1721 break; 1722 case "右上" : 1723 case "RT" : 1724 if(xy == "x") this.x -= (_abs); 1725 break; 1726 case "左" : 1727 case "left" : 1728 if(xy == "y") this.y -= (_abs / 2); 1729 break; 1730 case "中央" : 1731 case "center" : 1732 if(xy == "y") this.y -= (_abs / 2); 1733 if(xy == "x") this.x -= (_abs / 2); 1734 break; 1735 case "右" : 1736 case "right" : 1737 if(xy == "y") this.y -= (_abs / 2); 1738 if(xy == "x") this.x -= (_abs); 1739 break; 1740 case "左下" : 1741 case "LB" : 1742 if(xy == "y") this.y -= (_abs); 1743 break; 1744 case "下" : 1745 case "bottom" : 1746 if(xy == "y") this.y -= (_abs); 1747 if(xy == "x") this.x -= (_abs / 2); 1748 break; 1749 case "右下" : 1750 case "RB" : 1751 if(xy == "y") this.y -= (_abs); 1752 if(xy == "x") this.x -= (_abs); 1753 break; 1754 } 1755 } 1756 // -------------------------------------------------------------------// 1757 //マウス移動検知ハンドラ 1758 private function mouseMoveHandler(e:*):void { 1759 //表示されていたら消す 1760 deleteToolTip(); 1761 //マウスの移動が発生したら計りなおす 1762 toolTipTimer.stop(); 1763 toolTipTimer.start(); 1764 } 1765 // -------------------------------------------------------------------// 1766 //ツールチップ表示までの待ち時間が経過したら発動するハンドラ 1767 private function toolTipTimerHandler(e:*):void { 1768 //すでにボタンから離れていたら何もしない 1769 if(btnStatus == "out") return; 1770 //すでに表示されていたら何もしない 1771 if(toolTip_txt != null) return; 1772 //作る 1773 createToolTip(); 1774 } 1775 // -------------------------------------------------------------------// 1776 //ツールチップを表示する 1777 private function createToolTip():void { 1778 var _fmt:TextFormat = new TextFormat("_ゴシック"); 1779 toolTip_txt = new TextField(); 1780 toolTip_txt.autoSize = TextFieldAutoSize.LEFT; 1781 toolTip_txt.selectable = false; 1782 toolTip_txt.border = true; 1783 toolTip_txt.borderColor = 0x000000; 1784 toolTip_txt.background = true; 1785 toolTip_txt.backgroundColor = 0xFFFFE1; 1786 toolTip_txt.text = toolTip; 1787 toolTip_txt.textColor = 0x000000; 1788 toolTip_txt.setTextFormat(_fmt); 1789 toolTip_txt.mouseEnabled = false; 1790 1791 this.parent.addChild(toolTip_txt); 1792 trace(toolTip_txt.visible,"["+toolTip+"]",toolTip_txt.width,toolTip_txt.height); 1793 updateToolTipPosition(); 1794 } 1795 // -------------------------------------------------------------------// 1796 //ツールチップの表示位置を更新する 1797 private function updateToolTipPosition():void { 1798 var _vx = this.parent.mouseX; 1799 var _vy = this.parent.mouseY; 1800 _vy += 22;//マウスポインタにカぶらせないための下余白 1801 1802 //右にはみ出る場合 1803 if(_vx + toolTip_txt.width > this.stage.stageWidth){ 1804 _vx -= (_vx + toolTip_txt.width) - this.stage.stageWidth+2; 1805 } 1806 //下にはみ出る場合 1807 if(_vy + toolTip_txt.height > this.stage.stageHeight){ 1808 _vy -= (_vy + toolTip_txt.height) - this.stage.stageHeight+2; 1809 } 1810 //実装 1811 toolTip_txt.x = _vx; 1812 toolTip_txt.y = _vy; 1813 } 1814 // -------------------------------------------------------------------// 1815 //ツールチップを消す 1816 private function deleteToolTip():void { 1817 if(toolTip_txt == null) return; //すでに消してたら何もしない 1818 this.parent.removeChild(toolTip_txt);//まずステージから消す 1819 toolTip_txt = null; //そのあと参照をnullにしてガベコレさせる 1820 } 1821 // -------------------------------------------------------------------// 1652 1822 } 1653 1823 } mxp/specialbutton/as3/src/sample.txt
r1626 r1643 12 12 角の内側が二重に描画してるので均一に透明にならない状態をどうにかしたい。 〆 13 13 repeatプロパティ(ボタン押しっぱで指定のミリ秒ハンドラが起動し続ける。0だとリピートなし)を追加 〆 14 spb.shortCutKey //ショートカットキー 15 14 spb.shortCutKey //ショートカットキー 〆 15 dataのターゲットパスも評価の対象にする。 〆 16 spb.sizeChangePoint(サイズ変更時の基準点) 〆 17 spb.toolTip(ツールチップ) 〆 16 18 17 19 ■これから実装するもの 18 20 19 spb.toolTip20 spb.sizeChangePoint21 21 spb.overImage 22 22 23 23 日本語プロパティの英語表記プロパティも平行実装? 24 24 25 26 25 ■のちのち実装したいもの 27 26 textlabel単体,imageLabel単体のコンポーネント化 28 27 ショートカットキーのenabledをkeyListner起動しっぱなしで上位のenabledのみで判断してるため暇があったら改善したいね。 28 29 30 memo.ブラウザ標準のtooltipの仕様 31 画像上でマウスが停止して0.6秒後に、マウス位置より20px程度右下にツールチップが表示される 32 ツールチップの表示後のツールチップ消去の条件は 33 ・画像から離れる 34 ・ツールチップ本体にマウスが触れる 35 のどちらか。なお、ツールチップにマウスが触れた場合は相対位置に再表示される。 36 表示位置がstageの描画領域をオーバーする場合は調節される。
