Flex 3 Tree拖放很慢

时间:2009-10-14 20:45:51

标签: flex performance drag-and-drop

我有另一个拖放问题。我在树组件上使用DnD并且它工作正常,当我在树中有多达50-80个项目时。但是,当我有100-300个项目时,简单的拖放操作突然占用了我所有的CPU容量,应用程序冻结了长达1分钟。

我想这是因为Flex正在尝试重绘代理dragImage,因此需要重绘所有300个节点。有没有办法关掉dragImage?一个带有小矩形的简单光标箭头就足够了我的目的。

是否有其他人遇到过Flex Tree组件的性能问题?

感谢。

2 个答案:

答案 0 :(得分:1)

我使用Flex中的几个基于List的组件进行拖放操作,但没有遇到CPU容量过载或应用程序冻结的任何问题。我建议在Flex Builder中运行一个配置文件,看看是什么耗尽了所有的CPU和/或内存,并努力解决这个问题。

至于拖放,我总是倾向于创建自己的拖放功能,以便我可以用数据做我想做的事情,并创建我自己的代理图像。这是我在树组件中开始拖动的方法:

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

答案 1 :(得分:1)

我找到了问题的解决方案,请参阅http://compile4fun.wordpress.com/2010/10/29/optimization-drag-and-drop /其俄语,但您可以使用谷歌翻译。