【问题标题】:Flex 3 Tree drag-and-drop is slowFlex 3 树拖放很慢
【发布时间】:2010-10-29 20:27:27
【问题描述】:
我还有一个拖放问题。我在 Tree 组件上使用 DnD,当我在树中有多达 50-80 个项目时,它工作正常。但是,当我有 100-300 个项目时,简单的拖放操作会突然吃掉我所有的 CPU 容量,并且应用程序冻结长达 1 分钟。
我想这是因为 Flex 正在尝试重绘代理 dragImage,因此需要重绘所有 300 个节点。有没有办法关闭dragImage?一个带有小矩形的简单光标箭头就足够了。
还有其他人遇到过 Flex Tree 组件的性能问题吗?
谢谢。
【问题讨论】:
标签:
apache-flex
performance
drag-and-drop
【解决方案1】:
我曾在 Flex 中对几个基于列表的组件进行拖放操作,但没有遇到 CPU 容量过载或应用程序冻结的任何问题。我建议在 Flex Builder 中运行一个配置文件,看看是什么耗尽了所有 CPU 和/或内存,并努力解决这个问题。
至于拖放,我一直倾向于创建自己的拖放功能,这样我就可以对数据做我想做的事情,并创建自己的代理图像。以下是我在 Tree 组件中开始拖动的方式:
override protected function mouseDownHandler(event:MouseEvent):void
{
var eventPoint:Point = new Point(event.localX, event.localY);
var eventPointGlobal:Point = super.localToGlobal(eventPoint);
mouseDownPoint = super.globalToLocal(eventPointGlobal);
super.mouseDownHandler(event);
}
// MouseMove Handler for manually initiating Drag functionality
override protected function mouseMoveHandler(event:MouseEvent):void
{
super.mouseMoveHandler(event);
if (!event.buttonDown || DragManager.isDragging)
return;
/* Create a point relative to this component from the mouse
cursor location. */
var eventPoint:Point = new Point(event.stageX, event.stageY);
var dragPoint:Point = super.globalToLocal(eventPoint);
if (!mouseDownPoint)
return;
if (Math.abs(mouseDownPoint.x - dragPoint.x) <= 4
|| Math.abs(mouseDownPoint.y - dragPoint.y) <= 4)
return;
if (!event.target is UITextField)
return;
if (selectedItems.length == 0)
return;
var dragSource:DragSource = new DragSource();
var dragProxy:DragProxyContainer = new DragProxyContainer(); // This is my custom Drag Proxy Image that I reuse throughout my application (see below)
dragProxy.setLabelText([selectedItem]);
// Initiate the Drag Event
DragManager.doDrag(this, dragSource, event, dragProxy,
-dragPoint.x+event.localX, -dragPoint.y+event.localY, 0.8);
}
package view
{
import mx.containers.VBox;
import mx.core.UITextField;
[Bindable]
public class DragProxyContainer extends VBox
{
private var textField:UITextField = new UITextField();
public function DragProxyContainer()
{
super();
minWidth = 150;
addChild(textField);
}
public function setLabelText(items:Array, labelField:String = "label"):void
{
var labelText:String;
var numItems:int = items.length;
if (numItems > 1)
{
labelText = numItems.toString() + " items";
}
else
{
var firstItem:Object = items[0];
labelText = firstItem[labelField];
}
textField.text = labelText;
}
}
}