<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    TWaver - 專注UI技術

    http://twaver.servasoft.com/
    posts - 171, comments - 191, trackbacks - 0, articles - 2
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    TWaver網元動態轉動效果

    Posted on 2012-06-05 17:54 TWaver 閱讀(1378) 評論(0)  編輯  收藏
    最近有客戶提了一個網元動態旋轉的需求,用TWaver實現起來還是很方便的,效果如下圖所示:
    主要實現功能:
    1:網元動態旋轉
    2:網元選中效果,被選中網元快速轉到最前端后停止旋轉,取消選中自動重啟旋轉
    3:根據鼠標位置自動調整旋轉方向
    4:可以在程序中修改fw/bw/fh/bh調整圖片顯示效果
     

    代碼如下所示: 
      1 <?xml version="1.0" encoding="utf-8"?>
      2 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
      3                 layout="absolute"
      4                 creationComplete="test()"
      5                 width="100%"
      6                 height="100%"
      7                 xmlns:ns="http://www.servasoftware.com/2009/twaver/flex">
      8     <mx:Script>
      9         <![CDATA[
     10             import mx.events.ResizeEvent;
     11 
     12             import twaver.Collection;
     13             import twaver.Consts;
     14             import twaver.ElementBox;
     15             import twaver.IData;
     16             import twaver.IElement;
     17             import twaver.Layer;
     18             import twaver.Node;
     19             import twaver.SelectionChangeEvent;
     20             import twaver.SelectionModel;
     21             import twaver.Styles;
     22             import twaver.SubNetwork;
     23             import twaver.Utils;
     24             import twaver.core.util.l.u;
     25             private var box:ElementBox = new ElementBox();
     26 
     27             private var _rotationList:Collection = new Collection();
     28             private var rectIndexMap:Object = {};
     29             private var indexRectMap:Object = {};
     30             private var rList:Collection = new Collection();
     31             private var _startAngle:Number = 90;
     32             private var timer:Timer;
     33             private var _selectNode:Node;
     34 
     35             private var _clockSise:Boolean = false;
     36 
     37             private var _stopAngle:Number = 0;
     38             private var _needStop:Boolean = false;
     39 
     40             [Embed(source="images/1.png")]
     41             public static const p1:Class;
     42             [Embed(source="images/2.png")]
     43             public static const p2:Class;
     44             [Embed(source="images/3.png")]
     45             public static const p3:Class;
     46             [Embed(source="images/4.png")]
     47             public static const p4:Class;
     48             [Embed(source="images/5.png")]
     49             public static const p5:Class;
     50             [Embed(source="images/6.png")]
     51             public static const p6:Class;
     52             [Embed(source="images/7.png")]
     53             public static const p7:Class;
     54             [Embed(source="images/8.png")]
     55             public static const p8:Class;
     56 
     57             public function get clockSise():Boolean
     58             {
     59                 return _clockSise;
     60             }
     61 
     62             public function set clockSise(value:Boolean):void
     63             {
     64                 if(this.clockSise==value){
     65                     return;
     66                 }
     67                 _clockSise = value;
     68             }
     69             private function resetClockSize( point:Point):void {
     70                 if (_needStop == true) {
     71                     return;
     72                 }
     73                 if (point.x > this.network.width / 2) {
     74                     clockSise = false;
     75                 } else {
     76                     clockSise = true;
     77                 }
     78             }
     79 
     80             public function get selectNode():Node
     81             {
     82                 return _selectNode;
     83             }
     84 
     85             public function set selectNode(value:Node):void
     86             {
     87                 if(this.selectNode==value){
     88                     return;
     89                 }
     90                 _selectNode = value;
     91                 if(this.selectNode==null){
     92                     _needStop = false;
     93                     timer.delay = 30;
     94                     if(!timer.running){
     95                         timer.start();
     96                     }
     97                 }else{
     98                     var rect:Rectangle = indexRectMap[this.selectNode] as Rectangle;
     99                     var left:Boolean = (rect.x+rect.width/2)<network.width/2;
    100                     if(left){
    101                         clockSise = false;
    102                     }else{
    103                         clockSise = true;
    104                     }
    105                     var index:int = rotationList.getItemIndex(this.selectNode);
    106 
    107                     var size:int = this.rotationList.count;
    108                     var step:Number = 360/size;
    109                     _stopAngle = 90 - index * step;
    110                     _needStop = true;
    111                     timer.delay = 5;
    112                     if(!timer.running){
    113                         timer.start();
    114                     }
    115                 }
    116             }
    117 
    118             public function start():void{
    119                 timer.start();
    120             }
    121             public function stop():void{
    122                 if(timer!=null){
    123                     timer.stop();
    124                 }
    125             }
    126 
    127             public function get startAngle():Number
    128             {
    129                 return _startAngle;
    130             }
    131 
    132             public function set startAngle(value:Number):void
    133             {
    134                 _startAngle = (value+360)%360;
    135                 this.measureRotation();
    136             }
    137 
    138             public function get rotationList():Collection
    139             {
    140                 return _rotationList;
    141             }
    142 
    143             public function set rotationList(value:Collection):void
    144             {
    145                 _rotationList = value;
    146                 this.box.layerBox.clear();
    147                 var size:int = this.rotationList.count;
    148                 for(var i:int = 0;i<size;i++){
    149                     var l:Layer = new Layer("r:"+i);
    150                     box.layerBox.add(l);
    151                 }
    152                 this.measureRotation();
    153             }
    154             private function measureRotation():void{
    155                 rectIndexMap = {};
    156                 indexRectMap = {};
    157                 rList.clear();
    158                 var size:int = this.rotationList.count;
    159                 if(size==0){
    160                     return;
    161                 }
    162                 var w:Number = this.network.width;
    163                 var h:Number = this.network.height;
    164 
    165                 var fw:Number = 1.0 / 3 * w;
    166                 var bw:Number = 1.0 / 6 * w;
    167                 var fh:Number = h / 2.5;
    168                 var bh:Number = h / 7.0;
    169 
    170                 var m:Number = (fw - bw) / 4;
    171                 var cw:Number = m * 2 + bw;
    172                 var halfcw:Number = cw / 2;
    173                 var x:Number = halfcw + 15;
    174                 w = w - halfcw * 2 - 30;
    175                 var y:Number = bh / 2 + 10;
    176                 h = h - fh / 2 - bh / 2 - 20;
    177 
    178                 var step:Number = 360.0 / size;
    179                 for(var i:int = 0;i<size;i++){
    180                     var n:Node =  this.rotationList.getItemAt(i) as Node;
    181                     var p:Point = this.getPointAtEllipse(x,y,w,h,startAngle+step*i);
    182                     var px:Number = p.x;
    183                     var py:Number = p.y;
    184                     var pm:Number = (py - y) / h * (fw - bw) / 2;
    185                     var ww:Number = pm * 2 + bw;
    186                     var hh:Number = (py - y) / h * (fh - bh) + bh;
    187                     var rect:Rectangle = new Rectangle(px - ww / 2, py - hh / 2, ww, hh);
    188                     n.setSize(rect.width,rect.height);
    189                     n.setCenterLocation(px,py);
    190                     rectIndexMap[rect] = n;
    191                     indexRectMap[n] = rect;
    192                     rList.addItem(rect);
    193                 }
    194                 rList.sort(rectSort);
    195 
    196                 for(var j:int = 0;j<size;j++){
    197                     var rr:Rectangle = rList.getItemAt(j) as Rectangle;
    198                     var nn:Node = rectIndexMap[rr];
    199                     nn.layerID = "r:"+j;
    200                 }
    201             }
    202 
    203             private function rectSort(r1:Rectangle,r2:Rectangle):int{
    204                 if (r1.width> r2.width) {
    205                     return 1;
    206                 }
    207                 if (r1.width < r2.width) {
    208                     return -1;
    209                 }
    210                 return 0;
    211             }
    212 
    213             public function  getPointAtEllipse(x:Number,   y:Number,   w:Number,   h:Number,   angled:Number):Point {
    214                 var angle:Number =angled / 180.0 * Math.PI;
    215                 var px:Number = x + (Math.cos(angle) * 0.5 + 0.5) * w;
    216                 var py:Number = y + (Math.sin(angle) * 0.5 + 0.5) * h;
    217                 return new Point(px, py);
    218             }
    219 
    220             private function init():void{
    221                 timer=new Timer(30);
    222                 timer.addEventListener(TimerEvent.TIMER,function():void{
    223                     if(clockSise){
    224                         startAngle = startAngle+1;
    225                     }else{
    226                         startAngle = startAngle-1;
    227                     }
    228                     if(_needStop){
    229                         var abs:Number = Math.abs(startAngle-(_stopAngle+360)%360);
    230                         if(abs<2){
    231                             timer.stop();
    232                         }
    233                     }
    234                 });
    235                 network.addEventListener(MouseEvent.MOUSE_MOVE,function(e:MouseEvent):void{
    236                     var p:Point = network.getLogicalPoint(e);
    237                     resetClockSize(p);
    238                 });
    239                 network.addEventListener(MouseEvent.MOUSE_DOWN,function(e:MouseEvent):void{
    240                     var p:Point = network.getLogicalPoint(e);
    241                     var element:IElement = network.getElementByMouseEvent(e);
    242                     selectNode = element as Node;
    243                     resetClockSize(p);
    244                 });
    245                 network.addEventListener(ResizeEvent.RESIZE,function():void{
    246                     measureRotation();
    247                 });
    248             }
    249 
    250             private function test():void{
    251                 init();
    252                 Utils.registerImageByClass("p1", p1);
    253                 Utils.registerImageByClass("p2", p2);
    254                 Utils.registerImageByClass("p3", p3);
    255                 Utils.registerImageByClass("p4", p4);
    256                 Utils.registerImageByClass("p5", p5);
    257                 Utils.registerImageByClass("p6", p6);
    258                 Utils.registerImageByClass("p7", p7);
    259                 Utils.registerImageByClass("p8", p8);
    260                 var list:Collection = new Collection();
    261                 for(var i:int = 1;i<9;i++){
    262                     var sub:Node = new Node();
    263                     sub.setStyle(Styles.SELECT_STYLE,Consts.SELECT_STYLE_BORDER);
    264                     sub.setStyle(Styles.IMAGE_STRETCH,Consts.STRETCH_FILL);
    265                     sub.setStyle(Styles.SELECT_COLOR,"0x00ff00");
    266 
    267                     sub.setStyle(Styles.LABEL_POSITION,Consts.POSITION_CENTER);
    268                     sub.image = "p"+i;
    269                     sub.name = "sub"+i
    270                     list.addItem(sub);
    271                     box.add(sub);
    272                 }
    273                 this.rotationList = list;
    274                 network.elementBox = box;
    275                 this.start();
    276             }
    277 
    278         ]]>
    279     </mx:Script>
    280     <ns:Network id="network" width="100%" height="100%" backgroundColor="0xffffff">
    281 
    282     </ns:Network>
    283 </mx:Application>

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 四虎影院永久免费观看| 久久精品国产亚洲AV无码偷窥 | 国产午夜无码精品免费看| 亚洲国产精品第一区二区三区| 国产免费一区二区三区VR| 亚洲色中文字幕无码AV| 亚洲国产韩国一区二区| 免费精品视频在线| 免费成人av电影| 国产精品免费观看视频| 国产福利视精品永久免费| www.亚洲精品.com| 中文在线观看永久免费| 免费的黄网站男人的天堂| 久久精品视频免费看| 成人毛片视频免费网站观看| 亚洲午夜久久久影院伊人| 亚洲国产片在线观看| 久久久国产精品福利免费| 在线播放免费播放av片| 亚洲国产精品久久久久网站| 视频一区在线免费观看| 五月婷婷综合免费| 亚洲乱码日产精品一二三| 日韩在线永久免费播放| 亚洲国产V高清在线观看| 久久亚洲精品专区蓝色区| 久爱免费观看在线网站| 亚洲欧洲久久av| 无码国产精品一区二区免费式芒果 | 免费人成在线观看网站品爱网| 四虎永久精品免费观看| 亚洲国产成人资源在线软件| 国产在线国偷精品免费看| 在线jyzzjyzz免费视频| 亚洲精品国产福利在线观看| 成人精品视频99在线观看免费| 国产福利免费在线观看| 在线观看亚洲天天一三视| 亚洲爆乳成av人在线视菜奈实| 1000部羞羞禁止免费观看视频 |