`

flex中的拖放操作(二)

    博客分类:
  • Flex
阅读更多

在家上网赚钱更容易

手动添加 drag-and-drop 支持

在上一篇中你已经知道Flex中有一些控件内置了对drag-and-drop操作的支持,实现也相对方便,但往往要完成这样的操作,将一幅图片(没有内置drag-and-drop操作)拖动到一个表格中,在表格中显示相关信息,该如何实现呢?

       答案很简单,你必须显式的通过一系列专门的类和事件来添加对drag-and-drop的支持。

以下是实现drag-and-drop操作所用到的类和事件,

drag-and-drop 类:

功能

DragManager

管理 drag-and-drop 操作;例如,它的 doDrag() 方法启动一个拖拽操作。

DragSource

确定并且储存那些被拖拽的数据。它也提供一些附加的拖拽管理功能,例如可以在需要数据时添加侦听器的功能。

DragEvent

响应 drag-and-drop 事件,例如当用户将对象拖拽到一个拖拽目标上时。

drag-and-drop 事件:

事件

描述

mouseDown   and 
mouseMove

mouseDown 事件是当用户通过按住鼠标键来选择一个控件时广播。mouseMove 事件是当鼠标移动时广播。

对于大多数控件,你初始化 drag-and-drop 操作时是通过这两个事件。对于像 Tree 和 Grid 这些含有 dragEnabled 属性的控件,它本身提供了内在的初始化拖拽操作的支持,你不需要使用鼠标事件。

dragComplete

在一个拖拽操作完成时广播,无论当拖拽数据释放到一个释放目标,还是当 drag-and-drop 操作结束并没有进行释放操作。

你可以使用这个事件来进行任意最终的 drag-and-drop 操作清理工作。例如,如果一个用户从一个列表拖拽一个List控件数据项到另一个列表,你可以使用这个侦听器来删除源List控件中的数据项。

释放目标可以使用以下的事件:

dragEnter

当一个拖拽代理从目标外移动到目标上时广播。

一个组件成为一个释放目标必须为这个事件定义一个侦听器。使用侦听器,你可以改变释放目标的外观提供一个可视化的效果以便用户了解到这个组件可以接受拖拽操作,例如,你可以在释放目标周围绘制一个边框,或者使释放目标获得焦点。

dragDrop

dragDrop

当鼠标在目标上释放时广播。

你可以使用这个事件添加拖拽数据到目标上。

drag-and-drop 过程:

 

  1. 一个组件通过以下方法中的一种成为一个 drag-and-drop 初始器:

拥有 dragEnabled 属性的组件(这些组件包括 List,Tree,DataGrid,PrintDataGrid Menu,HorizontalList 以及 TileList):如果 dragEnabled 属性设置为 true,当用户此组件点击移动鼠标时,Flex 自动将其转为初始器。

没有 dragEnabled 属性的组件:对于其他所有的组件,必须接收到用户启动一个拖拽操作的趋势,然后显式的成为一个初始器。代表性地,你使用 mouseMove 或者 mouseDown 事件来启动 drag-and-drop 操作。

  1.  
    1. 组件创建一个 mx.core.DragSource 类的实例,其中包含要拖拽的数据,并且指定数据的格式。
    2. 组件调用 mx.managers.DragManager.doDrag() 方法,来初始化 drag-and-drop 操作。
  2. 当鼠标键一直按住时,用户在程序内部移动鼠标。Flex 在程序中显示拖拽代理图像。

注意

当拖拽代理没有在一个释放目标上时释放鼠标将结束 drag-and-drop 操作。Flex 会产生一个 DragComplete 事件于拖拽初始器,并且 DragManager.getFeedback() 方法返回 DragManager.NONE.

  1. 如果用户移动拖拽代理到一个 Flex 组件之上,Flex 广播一个 dragEnter 事件到这个准释放目标。这个目标组件必须为 dragEnter 事件定义一个事件侦听器,这样才能成为一个释放目标。

dragEnter 事件侦听器将检查 DragSource 对象以便决定拖拽数据是否是可接受的格式。为了接受释放,事件侦听器调用 DragManager.acceptDragDrop() 方法。

  1.  
    • 如果释放目标拒绝释放,释放目标组件的父级链中组件将逐一被检查,来检测是否有可以接受释放数据的组件。
    • 如果释放目标或者其父组件中的一个组件可以接受释放,当用户在目标上移动代理时,Flex 广播一个 dragOver 事件。
  2. 可选地,目标对象可以对 dragOver 事件进行处理。例如,目标可以使用这个事件侦听器来使其自身获得焦点。
  3. 如果用户放弃在释放目标上释放数据,并且一直没有松开鼠标将拖拽代理移动到释放目标之外,Flex 广播一个 dragExit 事件。释放目标可以处理这个事件,例如去回滚任何在 dragOver 事件侦听器中进行的操作。
  4. 如故用户在释放目标上松开鼠标,Flex 广播一个 dragDrop 事件。释放目标的 dragDrop 事件侦听器添加拖拽数据到目标中。
  5. 如果拖拽操作完成,Flex 广播一个 dragComplete 事件。拖拽初始器可以处理这个事件,例如删除从数据提供器(data provider)中删除拖拽数据。

 

 

例:

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

<mx:Script>

<![CDATA[

        import mx.collections.ArrayCollection;

        import mx.containers.Canvas;

        import mx.managers.DragManager;

        import mx.core.DragSource;

        import mx.events.DragEvent;

        private var provider:Array=new Array();

        private function doGrag(event:MouseEvent):void{

               var dragData:Object={"产品名称":"诺基亚7610","价格":"1650.00"};

               var ds:DragSource=new DragSource();

               ds.addData(dragData,"myDs");

               var cpyImage:Canvas=new Canvas();

               cpyImage.width=myImage.width;

               cpyImage.height=myImage.height;

               cpyImage.setStyle("backgroundImage",myImage.source);

               DragManager.doDrag(myImage,ds,event,cpyImage);        

        }

        private function doDragEnter(event:DragEvent):void

        {

               if (event.dragSource.hasFormat("myDs"))

               {

                      DragManager.acceptDragDrop(myDataGrid);

               }

        }

        private function doDragDrop(event:DragEvent):void

        {

               var data:Object =event.dragSource.dataForFormat("myDs");

               provider.push(data);

               myDataGrid.dataProvider=provider;

        }

]]>

</mx:Script>

<mx:Image id="myImage" x="55" y="75" source="Nokia_7610.png" mouseMove="doGrag(event)"/>

<mx:DataGrid  id="myDataGrid" x="222" y="103" dragEnter="doDragEnter(event)" dragDrop="doDragDrop(event)"/>

</mx:Application>

 

图一

var cpyImage:Canvas=new Canvas();

               cpyImage.width=myImage.width;

               cpyImage.height=myImage.height;

               cpyImage.setStyle("backgroundImage",myImage.source);

cpyImage是定义了一个图片的拖拽代理,将cpyimage的backgroundImage样式设置为图片的source属性,大小和图片一致。本例中用Canvas控件作为代理控件,Flex中任何可视控件都可作为代理。

 

写的不好,希望大家能看明白。

 

在家上网赚钱更容易

分享到:
评论

相关推荐

    Flex3组件拖放教程

    关于组件拖放 1 关于拖放操作 2 执行拖放操作 2 使用list-based控件 3 同个控件中执行拖放操作 6 获取拷贝中的类型信息 7 手动增加拖放操作支持 9 拖放操作 10 例子:Nonlist-based组件的...

    Flex:Web报表引擎——MyReport 2.3.0.0 + 免Flex开发集成版

    * 支持标题高度,行高,列宽拖动编辑,拖放调整顺序等良好操作。 内含: * MyReport报表引擎库文件MyReport.swc。 * MyReport免Flex开发集成版,适用于以传统html构建的系统,希望集成MyReport报表引擎的报表预览、...

    Flex:Web报表引擎——MyReport 2.3.6.0 + 免Flex开发集成版

    * 支持标题高度,行高,列宽拖动编辑,拖放调整顺序等良好操作。 内含: * MyReport报表引擎库文件MyReport.swc。 * MyReport免Flex开发集成版,适用于以传统html构建的系统,希望集成MyReport报表引擎的报表预览、...

    Flex:Web报表引擎+Web报表编辑器——MyReport 1.2.0.1

    * 支持标题高度,行高,列宽拖动编辑,拖放调整顺序等良好操作。 注: * 使用Flex SDK 3.5 * 内有报表样式定义说明 * 内有Demo工程参考,使用MyReport * 不提供MyReport源码,提供swc组件(类似dll) * 只需少量工作...

    Flex:Web报表引擎+Web报表编辑器MyReport 1.1.0.0

    * 支持标题高度,行高,列宽拖动编辑,拖放调整顺序等良好操作。 最新版2.0.0.0支持Adobe Flash Builder 4,Flex SDK 4.1。 下载地址:http://download.csdn.net/source/2540794 注: * 使用Flex SDK 3.5 * 内有...

    Flex:Web报表引擎+Web报表编辑器——MyReport 1.3.0.0

    * 支持标题高度,行高,列宽拖动编辑,拖放调整顺序等良好操作。 注: * 用Adobe Flash Builder 4/Flex Builder 3开发环境打开,用Flex SDK 3.5进行编译 * 内有报表样式定义说明 * 内有Demo工程参考,使用MyReport ...

    Flex:Web报表引擎+Web报表编辑器——MyReport 2.0.0.0

    * 支持标题高度,行高,列宽拖动编辑,拖放调整顺序等良好操作。 注: * 用Adobe Flash Builder 4开发环境打开,用Flex SDK 4.1进行编译 * 内有报表样式定义说明 * 内有Demo工程参考,使用MyReport * 不提供...

    Web报表引擎——MyReport 2.1.0.1 (免Flex开发集成版)+.Net集成示例源码

    适用于以传统html构建的系统,希望集成MyReport报表引擎的报表预览、打印和报表设计功能,并且不需要进行Flex相关的二次开发的用户。 详情参考:http://blog.csdn.net/hunkcai/archive/2010/11/10/6001513.aspx ...

    Flex:Web报表引擎+Web报表编辑器——MyReport 2.2.0.0

    * 支持标题高度,行高,列宽拖动编辑,拖放调整顺序等良好操作。 注: * 用Adobe Flash Builder 4开发环境打开,用Flex SDK 4.1进行编译 * 内有报表样式定义说明 * 内有Demo工程参考,使用MyReport * 不提供...

    ActionScript开发人员指南中文版

    AIR中拖放的基础知识 支持拖出手势 支持拖入手势 HTML中的拖放 将数据拖出HTML元素 将数据拖入HTML元素 示例:覆盖默认的HTML拖入行为 在非应用程序HTML沙箱中处理文件放置 放置文件释放 第章:使用菜单 菜单基础知识...

    贝壳企业网站管理系统ShellCMS v1.1.3

    产品结合中小企业用户的特点,设计了可视化拖放编辑模式,辅以强大的后台内容管理系统。无需写程序代码、无需美工基础,只要具有基本的审美观,就能迅速制作出美观实用的网站。 产品特点: 1、无需写代码、无需...

    AIR1.5_管理员指南(CN)

    AIR 应用程序支持本机桌面应用程序的诸多功能,其中包括对剪贴板和拖放的支持、本地文件 I/O 以及系统通知。适用于本机 应用程序的操作系统限制(例如特定于用户的权限)同样适用于 AIR 应用程序。有关安全性的详细...

    贝壳企业网站管理系统ShellCMS v1.1.3.rar

    11、后台基于flex,操作更加便捷。 12、良好的安全性。 13、可选多种网页布局模式。 14、一键智能排版,支持使用快捷键对模块位置及大小的微调。 15、基于云计算的架构。 16、内置数据缓存   安装 ...

    ActionScript开发技术大全

    8.2.3在FlexBuilder3中进行调试 155 8.3处理ActionScript3.0中的异常 160 8.3.1使用try…catch…finally语句 160 8.3.2throw语句主动抛出异常 162 8.3.3处理异常事件 163 8.4异常类型 163 8.4.1异常对象 164 8.4.2...

    flexDash:一个 JQueryUI 插件,用于创建由多个小部件组成的用户可自定义仪表板页面(类似于 MyYahoo.com、Start.Me 和 Protopage.com)

    每个小部件都有一个标题,其中包含用于触发“编辑”、“删除”、“显示信息”和“刷新”操作的按钮。 flexDash 客户端应用程序负责为每个动作提供处理函数。 更具体地说,flexDash 为交互用户请求的每个动作调用...

    软件界面设计工具_3款合集

    从能够显示您将获得什么的控件面板中进行拖放操作。 属性编辑程序使您能将每个元素进行自定义。 元素的自动生成功能。 您能在任何地方放置任何元素。 Edge snapping能通过“点击”对屏幕元素进行统一记录。 ...

    EADashboardHelper-crx插件

    可以在扩展名/键盘快捷方式中进行修改-添加了“可拖动”菜单以显示当前SAQL查询中使用的数据集-以及SAQL功能(即可以拖放)测量/变暗到编辑器中)-调整了静态编辑器以留出更多空间(使用可调整大小的文本区域)-自动...

    VMware Workstation Pro 12.0.0 Build 2985596 - 64bit [ENG] [Serial]

    著名虚拟机软件VMware Workstation专业版迎来了版本12。...利用 Workstation 12 Pro,您可以创建能够跨 VMware 产品组合运行的虚拟机,或创建能够在 Horizon FLEX 和 Workstation Player 中使用的受限虚拟机。

Global site tag (gtag.js) - Google Analytics