從我與基肖爾聊天后才明白:
用戶可以通過標記鼠標拖拽特定區域,並相應地添加評論。標記和評論存儲在數據庫中。
一次只放大一張圖像,此圖像應顯示所有標記。點擊標記會彈出一個顯示相關評論的彈出窗口。
顯然繪製標記是相當昂貴的,所以一旦繪製了特定的標記,應該在用戶在圖像之間切換時重新使用。現在的問題是:
如何重用圖像上顯示的標記?
答:
使用Object
或在其中創建每個圖像一個條目,該條目指向標記的Array
Dictionary
。您可以創建一個方便的類來封裝此地圖的功能:
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);
}
}
注:
的示例代碼假定您有承載所有標記標記容器。這個容器應該有一個對標記映射的引用。
我還不明白。你有單個圖像還是不同的圖像?用戶究竟是什麼?您想要刷新註釋的事件?單個圖像是否有多個註釋實例?集合應該存儲什麼? X,Y,W,H? –
註釋是文本?你的代碼只顯示一條畫線。 –
@Jens Struwe - 是的,我有一個圖片庫。一個圖像可能有多個註釋。我試圖保存註釋集合圖像,以便以後我可以讓我的用戶編輯/刪除特定圖像的註釋。當用戶在圖像上開始標記時,我不想直接將此子圖像添加到圖像中。我想將此註釋添加到添加到圖像的集合中。通過該集合,我可以刪除/編輯特定的註釋。 –