2011-08-04 40 views
0

我試圖在圖像上進行註釋。
我想將所有這些註釋存儲到集合中,以便稍後可以移除或編輯特定註釋(註釋)。將繪圖對象添加到Flex中的集合4

我創建例如標記一個UIComponent實例和做

markUp.graphics.lineStyle(2, drawColor); 
markUp.graphics.moveTo(x1, y1); 
markUp.graphics.lineTo(x2, y2); 

我想每一個用戶的時候使我像一個新的標註時間創建一個UIComponent實例。

如何生成動態實例以及如何將它們保存到集合中。任何幫助表示讚賞。

+0

我還不明白。你有單個圖像還是不同的圖像?用戶究竟是什麼?您想要刷新註釋的事件?單個圖像是否有多個註釋實例?集合應該存儲什麼? X,Y,W,H? –

+0

註釋是文本?你的代碼只顯示一條畫線。 –

+0

@Jens Struwe - 是的,我有一個圖片庫。一個圖像可能有多個註釋。我試圖保存註釋集合圖像,以便以後我可以讓我的用戶編輯/刪除特定圖像的註釋。當用戶在圖像上開始標記時,我不想直接將此子圖像添加到圖像中。我想將此註釋添加到添加到圖像的集合中。通過該集合,我可以刪除/編輯特定的註釋。 –

回答

1

從我與基肖爾聊天后才明白:

用戶可以通過標記鼠標拖拽特定區域,並相應地添加評論。標記和評論存儲在數據庫中。

一次只放大一張圖像,此圖像應顯示所有標記。點擊標記會彈出一個顯示相關評論的彈出窗口。

顯然繪製標記是相當昂貴的,所以一旦繪製了特定的標記,應該在用戶在圖像之間切換時重新使用。現在的問題是:

如何重用圖像上顯示的標記?

答:

使用Object或在其中創建每個圖像一個條目,該條目指向標記的ArrayDictionary。您可以創建一個方便的類來封裝此地圖的功能:

package { 
    import flash.display.DisplayObject; 

    public class Markups { 
     private var _map : Object; 

     public function Markups() { 
      _map = new Object(); 
     } 

     public function addMarkup(imageId : String, markup : DisplayObject) : void { 
      if (!_map[imageId]) _map[imageId] = new Array(); 
      (_map[imageId] as Array).push(markup); 
     } 

     public function hasMarkups(imageId : String) : Boolean { 
      return _map[imageId] !== undefined; 
     } 

     public function getMarkups(imageId : String) : Array { 
      return _map[imageId]; 
     } 

     public function removeMarkup(imageId : String, markup : DisplayObject) : void { 
      var markups : Array = _map[imageId]; 
      var index : int = markups.indexOf(markup); 
      markups.splice(index, 1); 
      if (!markups.length) delete _map[imageId]; 
     } 
    } 
} 

將此地圖存儲在可從圖像容器訪問的位置。

var markupsPerImage : Markups = new Markups(); 

添加或刪除這樣的標記:

markupsPerImage.addMarkup(myImage.id, markupView); 
markupsPerImage.removeMarkup(myImage.id, markupView); 

每當用戶改變當前圖像您1.清理最後和2添加存儲在地圖中的所有標記的所有標記。

在圖像容器:

public function setImage(myImage : MyImage) : void { 
    // remove markups 
    while (markupContainer.numChildren) { 
     markupContainer.removeChildAt(0); 
    } 
    // add markups 
    var markups : Array = markupsPerImage.getMarkups(myImage.id); 
    var markup : MarkupView; 
    foreach (markups as markup) { 
     markupContainer.addChild(markup); 
    } 
} 

注:

的示例代碼假定您有承載所有標記標記容器。這個容器應該有一個對標記映射的引用。

+0

感謝您的幫助@Jens Struwe。真的這是一個巨大的幫助:) –

+0

有時很難解釋或理解一個問題。快樂,我可以幫助你。 –