处理可编辑对象

Handling Editable Objects

场景如下。 用户选择图像、视频或其他类型的显示对象。它被加载到一个名为 EditableObject 的自定义 class 中。 EditableObject 的目标是 re-sizing 和 re-positioning。 EditableObject 有 4 个动画片段。

center_mc : 处理拖放并包含显示对象。

rightside_mc : 在 mousedown

上处理宽度 re-sizing

bottomside_mc : 在 mousedown

上处理 re-sizing 高度

bottomright_mc:处理鼠标按下时对象的缩放

到目前为止,我可以缩放这些对象的所有部分。错误是造成麻烦的原因。

当我在显示对象的底部或右侧单击时,在我移动鼠标之前,显示对象会从它处理的那一侧增加尺寸。我根据在 MOUSE_DOWN 和每个 MOUSE_MOVE 结束时传递的鼠标的 stageX 和 stageY 位置的差异获得移动量。这不是问题,它看起来很糟糕,目前正在解决第二个错误..

当我处理bottomright_mc时,我只能缩小对象。尝试横向扩展时,我必须将鼠标定位在 EditableObject 之外,以获得大于 bottomright_mc 当前位置的差异。这不起作用,因为任何退出 EditableObject 边界的尝试都会触发 MOUSE_UP,即使我使用 this.parent..

添加事件侦听器也是如此

我希望能够在按住并移动鼠标时使用 EditableObject 的两侧和一个角来 re-position 和缩放 EditableObject 内的任何内容。目前我只能移动对象,将对象缩放到小于其当前大小,并使用两侧调整对象的宽度和高度,但鼠标不匹配它当前在初始化时处理的一侧的位置。

这是 MOUSE_MOVE 处理程序的摘录。

private function handleMouseMove(e:MouseEvent):void
            {
                    switch(dragType)
                    {
                            case "right":
                                    trace("Right triggered.");
                                    this.width = e.stageX - this.x;
                                    break;
                            case "bottom":
                                    trace("Bottom triggered");
                                    this.height = e.stageY - this.y;
                                    break;
                            case "bottomright":
                                    resizeMe(this, e.stageX - this.x, this.height);
                                    break;
                    }


                    prevMouseX = e.stageX;
                    prevMouseY = e.stageY;
            }

可以找到 class 的完整代码 here on pastebin.

这是 Adob​​e Flash CC 中的可编辑对象 这是当前在编辑器中包含和处理图像的 EditableObject。

根据 TOMATO 在评论中提供的关于 Whosebug 的 this 回答,我发现了一个很棒的 API 只需几行代码就可以轻松处理 DisplayObjects。

我选择的是senocular的转换工具。可以找到他的工作演示 here。分解一下,这就是使用方法。

//Constructor
var editTool:TransformTool = new TransformTool(); 

//Add to stage (This will not be visible until you give your TransformTool a target)
addChild(editTool);

desiredDisplayObject.addEventListener(MouseEvent.CLICK, handleMouseClick)

function handleMouseClick(e:MouseEvent):void
{
    //Set the object clicked as the target for the TransformTool
    editTool.target = e.target as Sprite;
    //Swap the positioning in the display list so the TransformTool appears in front
    editTool.parent.setChildIndex(editTool, editTool.parent.numChildren - 1);
}

您可以通过多种方式完成此操作,但其基础是简单地将变换工具添加到舞台并将您想要的任何显示对象分配给变换工具。