在 Flex 4 中将绘图对象添加到集合中

发布于 2024-11-28 05:43:17 字数 331 浏览 1 评论 0原文

我正在尝试在图像上进行注释。
我想将所有这些注释存储到一个集合中,以便以后可以删除或编辑特定注释(注释)。

我正在创建一个 UIComponent 实例,例如 markUp,并且

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

每次用户在我的图像上进行新注释时我都想创建一个 UIComponent 实例。

如何生成动态实例以及如何将它们保存到集合中。任何帮助表示赞赏。

I'm trying to make annotations on an image.
I want to store all these annotations into a collection so that I can later remove or edit particular note(annotation).

I'm creating a UIComponent instance for example markUp and doing

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

I want to create a UIComponent instance every time whenever user makes a new annotation on my image.

How to generate dynamic instance and how to save them to a collection. Any help is appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

纸短情长 2024-12-05 05:43:17

根据我与 Kishor 聊天后的了解:

用户可以通过鼠标拖动来标记特定区域并相应地添加评论。标记和注释存储在数据库中。

一次只能放大一张图像,并且该图像应显示所有标记。单击标记将弹出一个弹出窗口,显示相关的评论。

显然,绘制标记相当昂贵,因此一旦绘制了特定标记,当用户在图像之间切换时就应该重复使用。现在的问题是:

如何重用图像上显示的标记?

答案:

使用 对象字典,为每个图像创建一个条目,并且该条目指向标记的Array。您可以创建一个方便的类来封装此地图的功能:

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);
    }
}

注意:

示例代码假设您有一个托管所有标记的标记容器。该容器应该具有对标记映射的引用。

From what I understand after a chat with Kishor:

Users may mark specific areas by mouse drag and add a comment accordingly. Markup and comment are stored in the database.

There is only one image enlarged at a time, and this image should display all markups. Clicking on a markup will raise a popup showing the associated comment.

Apparently drawing the markup is rather expensive, so once drawn a particular markup should be reused when the user switchs between images. The question is now:

How to reuse markups displayed on an image?

Answer:

Use an Object or Dictionary where you create one entry per image and the entry points to an Array of markups. You may create a convenient class to encapsulate the functionality of this map:

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];
        }
    }
}

Store this map at a place that is accessible from your image container.

var markupsPerImage : Markups = new Markups();

Add or remove a markup like this:

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

Whenever the user changes the current image you 1. cleanup all markups of the last and 2. add all markups stored in the map.

In the image container:

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);
    }
}

Notes:

The example code assumes you have a markup container that hosts all markups. This container should have a reference to the markup map.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文