Apache flex 在Flex/Actionscript中连接线(拖动时)
我有一个mx:Canvas元素,它包含几个mx:Panel元素。我希望能够画一条连接两个这样的mx:Panel的线,当其中一个或两个被拖来拖去时,这条线会继续连接两个mx:Panel。这似乎是件小事,但我一直没能弄明白 事实上,这就是问题所在 由于更新仅在面板到达其最终位置时发生,因此一旦开始拖动“B”面板,就会留下一条悬空线: 下面建议的一个可能的解决方案是重写mx:Canvas组件的updateDisplayList()方法。不幸的是,这只会在拖动后更新图形,而不会在运动时更新。 侦听面板中的“xChanged”和“yChanged”事件会产生与重写updateDisplayList()相同的结果 正如下面指出的,最终的解决方案需要将移动事件从移动面板分派到它正在移动的画布。这将强制在整个运动中重新绘制线条Apache flex 在Flex/Actionscript中连接线(拖动时),apache-flex,actionscript-3,air,flex3,Apache Flex,Actionscript 3,Air,Flex3,我有一个mx:Canvas元素,它包含几个mx:Panel元素。我希望能够画一条连接两个这样的mx:Panel的线,当其中一个或两个被拖来拖去时,这条线会继续连接两个mx:Panel。这似乎是件小事,但我一直没能弄明白 事实上,这就是问题所在 由于更新仅在面板到达其最终位置时发生,因此一旦开始拖动“B”面板,就会留下一条悬空线: 下面建议的一个可能的解决方案是重写mx:Canvas组件的updateDisplayList()方法。不幸的是,这只会在拖动后更新图形,而不会在运动时更新。 侦听面
谢谢你的帮助 您希望覆盖画布上的UIComponent方法updateDisplayList(),并在其中进行绘图 这是假设您通常熟悉AS3中的线条绘制 “我已经试过了 的updateDisplayList()方法 mx:Canvas组件,但似乎 仅在修改后更新图形 拖拉。我想把电话线挂断 按照mx:面板的显示方式进行操作 拖。” 您可以侦听面板中的事件,让处理程序调用重新绘制行,然后让面板在拖动这些事件时通过侦听阶段中的
MouseEvent.MOUSE\u MOVE
事件并在处理程序中调度MOVE
事件来调度这些事件(将此处理程序附加到面板的MouseEvent.MOUSE\u DOWN
事件处理程序中的后台,以及MouseEvent.MOUSE\u UP
的处理程序(也附加到后台)--然后从MOUSE\u UP
处理程序中的后台删除这两个事件侦听器。)
下面是一个示例(这将在Panel子类中:)
是一个开源项目,用于实现这种类型的“连接线”Flex中的UI范型。它可能正好适合您的需要。您不能在这里使用绑定功能吗?线的端点绑定到圆的中心?flash/Flex的新功能,并且有一个类似的问题。我通过将事件侦听器附加到Enter\u Frame事件来解决它。我不确定这是否是最有效的解决方案,因为它重新绘制了e即使物体没有移动,但对我有效:
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.events.Event;
public class Association extends Sprite
{
private var t1:DisplayObject;
private var t2:DisplayObject;
//Connects two objects
public function Association(t1:DisplayObject, t2:DisplayObject)
{
this.t1=t1;
this.t2=t2;
this.addEventListener(Event.ENTER_FRAME, redraw)
super();
}
public function redraw(event:Event):void
{
graphics.clear();
graphics.lineStyle(2,0x000000);
graphics.moveTo(t1.x,t1.y);
graphics.lineTo(t2.x,t2.y);
}
}
这并不是我的意思。我已经设法让线在新位置重新绘制,但这只有在我停止拖动mx:Panels后才会发生。我希望重新绘制也能在东西移动时进行。嗯……这似乎与以前的解决方案类似。它只在我“放下”时更新面板,而不是当它移动时。(您可以通过向coordsChangedHandler()函数添加跟踪来测试它)好的,谢谢您提供的信息--我将建议更改为实际对我有用的内容。仍然没有(参见上面的EDIT3)。也许我遗漏了什么?添加了一个代码示例来说明我的混乱解释。希望有帮助:)
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.events.Event;
public class Association extends Sprite
{
private var t1:DisplayObject;
private var t2:DisplayObject;
//Connects two objects
public function Association(t1:DisplayObject, t2:DisplayObject)
{
this.t1=t1;
this.t2=t2;
this.addEventListener(Event.ENTER_FRAME, redraw)
super();
}
public function redraw(event:Event):void
{
graphics.clear();
graphics.lineStyle(2,0x000000);
graphics.moveTo(t1.x,t1.y);
graphics.lineTo(t2.x,t2.y);
}
}