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中任何可视控件都可作为代理。

 

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

 

在家上网赚钱更容易

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的拖放操作的井字棋游戏的HTML5代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Tic Tac Toe Game</title> <style> #board { display: flex; flex-wrap: wrap; width: 330px; height: 330px; margin: auto; border: solid 1px black; } .square { width: 100px; height: 100px; border: solid 1px black; text-align: center; font-size: 72px; line-height: 96px; cursor: pointer; } .square.x { color: blue; } .square.o { color: red; } </style> </head> <body> <h1>Tic Tac Toe Game</h1> <div id="board"> <div class="square"></div> <div class="square"></div> <div class="square"></div> <div class="square"></div> <div class="square"></div> <div class="square"></div> <div class="square"></div> <div class="square"></div> <div class="square"></div> </div> <script> const squares = document.querySelectorAll('.square'); let currentPlayer = "x"; let gameStatus = ["", "", "", "", "", "", "", "", ""]; function handleDragStart(event) { event.dataTransfer.setData("text/plain", event.target.id); } function handleDragEnter(event) { event.preventDefault(); event.target.classList.add("over"); } function handleDragOver(event) { event.preventDefault(); } function handleDragLeave(event) { event.target.classList.remove("over"); } function handleDrop(event) { event.preventDefault(); const square = event.target; const id = event.dataTransfer.getData("text/plain"); const draggedSquare = document.getElementById(id); const squareIndex = Array.prototype.indexOf.call(squares, square); const draggedSquareIndex = Array.prototype.indexOf.call(squares, draggedSquare); if (gameStatus[squareIndex] === "") { square.classList.remove("over"); square.classList.add(currentPlayer); square.innerHTML = currentPlayer.toUpperCase(); gameStatus[squareIndex] = currentPlayer; draggedSquare.classList.remove(currentPlayer); draggedSquare.innerHTML = ""; gameStatus[draggedSquareIndex] = ""; checkResult(); changePlayer(); } } function changePlayer() { currentPlayer = currentPlayer === "x" ? "o" : "x"; } function checkResult() { const winningCombos = [ [0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6] ]; for (let i = 0; i < winningCombos.length; i++) { const combo = winningCombos[i]; if (gameStatus[combo[0]] !== "" && gameStatus[combo[0]] === gameStatus[combo[1]] && gameStatus[combo[1]] === gameStatus[combo[2]]) { alert(currentPlayer.toUpperCase() + " has won!"); resetGame(); break; } else if (gameStatus.indexOf("") === -1) { alert("Draw!"); resetGame(); break; } } } function resetGame() { for (let i = 0; i < squares.length; i++) { squares[i].classList.remove("x", "o"); squares[i].innerHTML = ""; gameStatus[i] = ""; } currentPlayer = "x"; } for (let i = 0; i < squares.length; i++) { const square = squares[i]; square.addEventListener("dragstart", handleDragStart); square.addEventListener("dragenter", handleDragEnter); square.addEventListener("dragover", handleDragOver); square.addEventListener("dragleave", handleDragLeave); square.addEventListener("drop", handleDrop); } </script> </body> </html>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值