<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    最近用戶有個比較“變態”的需求:從工具欄上將節點拖入拓撲圖中時,如果鼠標下面是Link,就將節點插入這條Link之間;而且鼠標在拖拽過程中,鼠標下面的link呈現凸起效果。

    在Link之間插入節點好說,可以刪除這條Link再添加兩條Link,不過凸起效果就有點費勁了。這里用TWaver Flex的ShapeLink實現比較滿意的效果:


    大概思路是:
    1. 監聽network的DragEvent.DRAG_OVER事件,用network#getElementsByDisplayObject方法判斷鼠標下面是否有Link。如果有就將這個Link變成透明(link.setStyle(Styles.LINK_ALPHA, 0);),然后加入一條ShapeLink;如果沒有就將之前變成透明的Link還原,并刪除ShapeLink。具體代碼見updateMark以及removeMark方法:

     1 private function updateMark(link:Link, data:Object, point:Point):void {
     2     if(!network.elementBox.contains(markLink)){
     3         markLink.fromNode = link.fromNode;
     4         markLink.toNode = link.toNode;
     5         markLink.setStyle(Styles.SHAPELINK_TYPE, Consts.SHAPELINK_TYPE_QUADTO);
     6         markLink.setStyle(Styles.LINK_WIDTH, link.getStyle(Styles.LINK_WIDTH));
     7         markLink.setStyle(Styles.LINK_COLOR, link.getStyle(Styles.LINK_COLOR));
     8         markLink.setStyle(Styles.LINK_ALPHA, link.getStyle(Styles.LINK_ALPHA));
     9 
    10         network.elementBox.add(markLink);
    11         lastLink = link;
    12         link.setStyle(Styles.LINK_ALPHA, 0);
    13     }
    14 
    15     var points:Collection = new Collection();
    16 
    17     var fromCenter:Point = markLink.fromNode.centerLocation;
    18     var toCenter:Point = markLink.toNode.centerLocation;
    19     var radius:Number = Math.sqrt(data.width*data.width + data.height*data.height)/2;
    20     var crossPoints:Object = getCrossPoints(fromCenter, toCenter, point, radius*2);
    21     if (crossPoints){
    22         if(fromCenter.x<toCenter.x){
    23             points.addItem(crossPoints.p2);
    24             points.addItem(crossPoints.p2);
    25         }else{
    26             points.addItem(crossPoints.p1);
    27             points.addItem(crossPoints.p1);
    28         }
    29 
    30         var crossPoint:Point = new Point(crossPoints.p1.x + (crossPoints.p2.x-crossPoints.p1.x)/2,
    31             crossPoints.p1.y + (crossPoints.p2.y-crossPoints.p1.y)/2);
    32         var controlPoints:Object = getCrossPoints(crossPoint, point, point, radius*3);
    33         if(controlPoints){
    34             if(crossPoint.y >= point.y){
    35                 points.addItem(controlPoints.p2);
    36             }else{
    37                 points.addItem(controlPoints.p1);
    38             }
    39         }else{
    40             if(point.y>=fromCenter.y){
    41                 point.y = point.y - radius * 3;
    42             }else{
    43                 point.y = point.y + radius * 3;
    44             }
    45             points.addItem(point);
    46         }
    47         if(fromCenter.x<toCenter.x){
    48             points.addItem(crossPoints.p1);
    49             points.addItem(crossPoints.p1);
    50         }else{
    51             points.addItem(crossPoints.p2);
    52             points.addItem(crossPoints.p2);
    53         }
    54     }else{
    55         points.addItem(fromCenter);
    56     }
    57     markLink.points = points;
    58 }
    59 
    60 private function removeMark(moving:Boolean):void {
    61     if(network.elementBox.contains(markLink)){
    62         var fromNode:Node = markLink.fromNode;
    63         var toNode:Node = markLink.toNode;
    64         network.elementBox.remove(markLink);
    65         if(lastLink && moving){
    66             lastLink.setStyle(Styles.LINK_ALPHA, markLink.getStyle(Styles.LINK_ALPHA));
    67             lastLink = null;
    68         }
    69     }
    70 }
    71 

     

    2. 最關鍵的是如何確定ShapeLink的points。這里的核心是計算圓和直線的交點。具體代碼見getCrossPoints方法:

     1 private function getCrossPoints(p1:Point, p2:Point, circleCenter:Point, radius:Number):Object{
     2     var line_p1_x:Number = p1.x;
     3     var line_p1_y:Number = p1.y;
     4     var line_p2_x:Number = p2.x;
     5     var line_p2_y:Number = p2.y;
     6     var circle_center_x:Number = circleCenter.x;
     7     var circle_center_y:Number = circleCenter.y;
     8     var circle_radius:Number = radius;
     9     var line_k:Number =(line_p2_y-line_p1_y)/(line_p2_x-line_p1_x);
    10     var line_b:Number =line_p1_y-line_k*line_p1_x;
    11     var a:Number =1+line_k*line_k;
    12     var b:Number =-2*circle_center_x+2*line_k*line_b-2*line_k*circle_center_y;
    13     var c:Number =circle_center_x*circle_center_x+(line_b-circle_center_y)*(line_b-circle_center_y)-circle_radius*circle_radius;
    14     var delta:Number =b*b-4*a*c;
    15     var x1:Number =(-b+Math.sqrt(delta))/(2*a);
    16     var x2:Number =(-b-Math.sqrt(delta))/(2*a);
    17     var y1:Number =line_k*x1+line_b;
    18     var y2:Number =line_k*x2+line_b;
    19 
    20     if(delta>=0){
    21         return {p1: new Point(x1, y1), p2: new Point(x2, y2)};
    22     }else{
    23         return null;
    24     }
    25 }
    26 

     

    3. 在DragEvent.DRAG_DROP事件里,刪除ShapeLink并創建兩條Link。

    源碼下載

     


    評論

    # re: Flex下實現拖動節點時,連線拱起的效果  回復  更多評論   

    2011-02-17 22:34 by 奇幻修真小說
    最關鍵的是如何確定ShapeLink的points。這里的核心是計算圓和直線的交點。

    # re: Flex下實現拖動節點時,連線拱起的效果  回復  更多評論   

    2011-02-20 17:09 by 好店8
    確實是比較變態的要求。。。項目做多了,總會碰到各樣奇怪的要求。。

    # re: Flex下實現拖動節點時,連線拱起的效果  回復  更多評論   

    2011-02-21 09:50 by qiuyunanjichong
    這需求不是一般變態

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


    網站導航:
     
    主站蜘蛛池模板: 国产又粗又长又硬免费视频| 免费能直接在线观看黄的视频| 在线观看91精品国产不卡免费| 亚洲AV无码乱码在线观看代蜜桃 | 国产成人无码区免费A∨视频网站| 亚洲一区在线免费观看| 人成午夜免费视频在线观看| a毛片免费观看完整| 亚洲深深色噜噜狠狠爱网站| 久久久WWW成人免费精品| 亚洲中文字幕在线观看| 天黑黑影院在线观看视频高清免费| 亚洲午夜国产精品无码| 久久免费视频99| 亚洲另类自拍丝袜第1页| 四虎免费大片aⅴ入口| 爱情岛论坛免费视频| 亚洲精品V欧洲精品V日韩精品 | 亚洲精品tv久久久久久久久| 日本一道本不卡免费| 亚洲中文字幕在线无码一区二区| 精品熟女少妇AV免费观看| 国产精品亚洲va在线观看| 国产精品亚洲二区在线观看| 99ee6热久久免费精品6| 久久久无码精品亚洲日韩软件 | 成人无码精品1区2区3区免费看 | 亚洲色一区二区三区四区| 亚洲人成色7777在线观看不卡| 精品久久亚洲中文无码| 免费一级成人毛片| 亚洲午夜免费视频| 亚洲欧美综合精品成人导航| 亚洲一区二区三区无码影院| 四虎在线成人免费网站| 一区二区三区精品高清视频免费在线播放 | 国产极品美女高潮抽搐免费网站| yellow免费网站| 亚洲国产精品成人综合久久久| 国产免费小视频在线观看| 玖玖在线免费视频|