【问题标题】: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;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      我已经找到了问题的解决方案,见http://compile4fun.wordpress.com/2010/10/29/optimization-drag-and-drop/它的俄语,但你可以使用谷歌翻译。

      【讨论】:

        猜你喜欢
        • 2010-12-24
        • 1970-01-01
        • 2011-08-05
        • 1970-01-01
        • 2011-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多