问题:
list里面的对象怎样拖到画面里?
思路
把list里的对象直接拖到画面里的功能,在场景编辑器里常常用到,我们会放一个List,里面每一项对应一个建筑物,用户可以把建筑物拖拽到场景中。这也和flash的元件库拖拽东西到舞台是一样的效果。
我们可以在List的每一项中存储该项所对应的ClassName,当拖拽开始时,创建对应的实例,并让它跟随鼠标。直到在画面有效区域中松开鼠标才将其添加到新的DisplayObjectContainer内。
具体的我写了一个演示,右侧是List,请从里面把内容拖到左侧的框框里放下看效果。点击此处下载源文件。
Document Class :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
package org.mousebomb.dragLiToCanvas { import fl.events.ListEvent; import fl.controls.List; import fl.data.DataProvider; import flash.display.Sprite; import flash.events.MouseEvent; import flash.geom.Point; import flash.utils.getDefinitionByName; /** * @author Mousebomb (mousebomb@gmail.com) * @date 2010-4-27 */ public class DragListItemToCanvas extends Sprite { public var list : List; public var canvas : Sprite; private var isHoverLi : Boolean = false; private var curHoverLi : Object ; public function DragListItemToCanvas() { //如果不写下面这一行,flash不会将此类编译进去,运行时会报错 Class1; Class2; //创建list的内容 list.dataProvider = new DataProvider(); list.addItem({label:"有胆你就拖拽我", data:"org.mousebomb.dragLiToCanvas.Class1"}); list.addItem({label:"我和楼上一样", data:"org.mousebomb.dragLiToCanvas.Class2"}); list.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownH); list.addEventListener(ListEvent.ITEM_ROLL_OVER, onHoverLi); list.addEventListener(ListEvent.ITEM_ROLL_OUT, onOutLi); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpH); } private function onOutLi(event : ListEvent) : void { isHoverLi = false; curHoverLi = null; } private function onHoverLi(event : ListEvent) : void { isHoverLi = true; curHoverLi = event.item; } //松开鼠标 private function onMouseUpH(event : MouseEvent) : void { //有拖拽物体 if(curDraging) { curDraging.stopDrag(); removeChild(curDraging); //在canvas上着陆 if(canvas.hitTestPoint(event.stageX, event.stageY)) { canvas.addChild(curDraging); curDraging.alpha = 1; var localPos : Point = canvas.globalToLocal(new Point(event.stageX, event.stageY)); curDraging.x = localPos.x; curDraging.y = localPos.y; } curDraging = null; } } //记录当前拖拽 private var curDraging : Sprite; private function onMouseDownH(event : MouseEvent) : void { if(curHoverLi) { var className : String = curHoverLi["data"]; curDraging = getItemByClassName(className); curDraging.x = event.stageX; curDraging.y = event.stageY; curDraging.alpha = .6; addChild(curDraging); curDraging.startDrag(); } } //获取对应的实例 private function getItemByClassName(className : String) : Sprite { var cla : Class = getDefinitionByName(className) as Class; return new cla(); } } } |
额,这句是关键
var cla : Class = getDefinitionByName(className) as Class;
非常好感谢喔。我用的是flash builder 4 的组件,是一个spark主题,我用itemRenderer去渲染里面的子项目,拖动的问题解决了,可是我要怎么访问list的子项目呢?
@TonySan, spark的不清楚,我很少用FB,你应该可以在文档上找到访问子项目的介绍吧。
wp我就感觉到两个字 复杂
对了 朋友 你看看我的博客 文章页面的title值 你知道文章类别怎么调用 并且没有a标签的吗
钢好要用到LIST 的拖拽功能,谢谢共享
后台-外观-编辑当前主题中的single.php,把标题的那部分代码由
<a href="< ?php the_permalink() ? rel="nofollow">" rel="bookmark">< ?php the_title(); ?></a>
改成
< ?php the_title(); ?>
感觉首页进来的link 有点怪。
博主flash高手。顶了