一步一步实现AS3拖放组件
外话:
我之前在天地会上发布过一个拖放组件,http://bbs.9ria.com/thread-117535-1-1.html

- 可以拖
- 可以放
- 交换,替换,覆盖之类(由拖和放组合完成)


public static var avatarContainer:Sprite;
public static var avatarBmp:Bitmap;
public static var isDraging:Boolean;
还需要一个静态方法来初始化拖放类:
 public static function init():void{
     if(!avatarContainer){
         avatarContainer = new Sprite();
         avatarContainer.mouseEnabled = false;
         avatarBmp = new Bitmap();
         avatarContainer.addChild(avatarBmp);
     }
     isDraging = false;
 }
然后我们就可以开始写拖放:
在构造方法中初始化变量和侦听鼠标事件
 private function init():void{
     _accept = false;
     dragable = false;
     _mouseDownPoint = new Point();
     addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
     addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
     addEventListener(MouseEvent.ROLL_OVER, onRollOver);
 }
在鼠标按下时,要记录按下的坐标,并侦听stage的鼠标弹起事件,在判断是否支持拖操作后,进行拖操作
 protected function onMouseDown(event:MouseEvent):void{
     stage.addEventListener(MouseEvent.MOUSE_UP, onStageMouseUp);
     if(dragable){
         _mouseDownPoint.x = event.localX;
         _mouseDownPoint.y = event.localY;
         beginDrag();
     }
 }
开始拖操作,我们要获得一下在拖动时需要呈现的那张图,图可以在子类中重写dragAvatar()方法类获得
在执行拖动前,会执行beforDrag(),我们可以在这里对呈现图进行处理,比如加点透明度之类的
我写的拖放直接使用了as3提供的startDrag,方便快捷!
 protected function beginDrag():void{
     avatarBmp.bitmapData = dragAvatar;
     beforDrag();
     if(!stage.contains(avatarContainer)){
         stage.addChild(avatarContainer);
     }
     itemSrc = this;
     var sPoint:Point = this.localToGlobal(new Point(mouseX, mouseY));
     avatarContainer.x = sPoint.x - _mouseDownPoint.x;
     avatarContainer.y = sPoint.y - _mouseDownPoint.y;
     avatarContainer.startDrag();
     isDraging = true;
 }
 protected function get dragAvatar():BitmapData{
     return ObjectUtils.cloneDisplayObject(this);
 }
 protected function beforDrag():void{
     avatarBmp.alpha = 0.8;
 }
就此,拖的过程就搞定了,接下来的就是放操作了。
其实拖放的大头主要在放的操作上,因为拖操作决定的只是数据源,而放操作则会涉及到各种逻辑处理
放操作会在ROLL_OVER事件开始,当鼠标拖着东西进入目标对象时,会触发dragEnter()方法,然后触发addEffect()方法,在移出时会触发removeEffect()方法
问:什么是addEffect()和removeEffect()方法?
答:在放操作的时候,如果目标对象不让放操作或者拖放源不符合条件,那放操作将不给予通行,我在拖进时加了一个dragEnter()方法,返回值就是是否准许放操作,根据返回值,来添加一些特效,
 当左边拖到右边时,是不被准许,所以我加了个红色外发光的特效
当左边拖到右边时,是不被准许,所以我加了个红色外发光的特效
 当右边的拖到右边时,准许拖放,所以我加了个蓝色外发光的特效
当右边的拖到右边时,准许拖放,所以我加了个蓝色外发光的特效
protected function dragEnter(itemSrc:DragableItem):Boolean{
    trace("dragEnter");
    return true;
}
protected function onRollOver(event:MouseEvent):void{
    addEventListener(MouseEvent.ROLL_OUT, onRollOut);
    if(isDraging && itemSrc != this){
        addEffect(_accept = dragEnter(itemSrc));
    }
}
protected function onRollOut(event:MouseEvent):void{
    removeEventListener(MouseEvent.ROLL_OUT, onRollOut);
    if(isDraging && itemSrc != this){
        removeEffect();
    }
}
最后就是两个MOUSE_UP事件了
 protected function onMouseUp(event:MouseEvent):void{
     if(_accept){
         dragDrop(itemSrc);
     }
     endDrag();
     isDraging = false;
     if(itemSrc != this){
         removeEffect();
     }
 }
 protected function onStageMouseUp(event:MouseEvent):void{
     stage.removeEventListener(MouseEvent.MOUSE_UP, onStageMouseUp);
     if(isDraging){
         endDrag();
         isDraging = false;
         if(itemSrc != this){
             removeEffect();
         }
     }
 }
前者是自身的鼠标弹起,后者是stage的鼠标弹起
在自身的鼠标弹起事件,如果放操作被准许,那么就实行dragDrop()方法,最后结束拖放和移除特效
在stage的鼠标弹起事件中也做一些收尾操作,当然,我的代码有些冗余了
而后要实现的交换,替换,覆盖等操作,都交给子类的dragDrop()方法来实现就行
比如我写的一个子类中,判断左右域不能互拖的限制:
override protected function dragEnter(itemSrc:DragableItem):Boolean
{
var _itemSrc:DragItemSimple = itemSrc as DragItemSimple;
return int(_itemSrc.index / 10) == int(index / 10);
}
我只是判断索引的十位数是否相等,相等就返回true,就是可拖放,不相等就返回false,就是不可拖放。
总结:
做拖放也不是很难,只要理清思路。
说了那么多(其实是代码贴得多了点,o(∩_∩)o ),源码提供下载:
下载点:DragableItem
一步一步实现AS3拖放组件的更多相关文章
- C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)
		前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ... 
- C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper
		前言:之前学习过很多的Bootstrap组件,博主就在脑海里构思:是否可以封装一套自己Bootstrap组件库呢.再加上看到MVC的Razor语法里面直接通过后台方法输出前端控件的方式,于是打算仿照H ... 
- 一步一步学Silverlight 2系列(5):实现简单的拖放功能
		述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ... 
- 大流量网站性能优化:一步一步打造一个适合自己的BigRender插件
		BigRender 当一个网站越来越庞大,加载速度越来越慢的时候,开发者们不得不对其进行优化,谁愿意访问一个需要等待 10 秒,20 秒才能出现的网页呢? 常见的也是相对简单易行的一个优化方案是 图片 ... 
- 一步一步跟我学DeviceOne开发 - 仿微信应用(一,二,三)
		这是一个系列的文档,长期目标是利用DeviceOne开发一些目前使用广泛的优质手机应用,我们会最大化的实现这些应用的每一个功能和细节,不只停留在简单的UI模仿和Demo阶段,而是一个基本可以使用的实际 ... 
- 一步一步教你如何在linux下配置apache+tomcat(转)
		一步一步教你如何在linux下配置apache+tomcat 一.安装前准备. 1. 所有组件都安装到/usr/local/e789目录下 2. 解压缩命令:tar —vxzf 文件名(. ... 
- 一步一步理解Paxos算法
		一步一步理解Paxos算法 背景 Paxos 算法是Lamport于1990年提出的一种基于消息传递的一致性算法.由于算法难以理解起初并没有引起人们的重视,使Lamport在八年后重新发表到 TOCS ... 
- 跟我一步一步开发自己的Openfire插件
		http://www.blogjava.net/hoojo/archive/2013/03/07/396146.html 跟我一步一步开发自己的Openfire插件 这篇是简单插件开发,下篇聊天记录插 ... 
- 一步一步深入spring(2)-三种方式来实例化bean
		在一步一步深入spring(1)--搭建和测试spring的开发环境中提到了一种实例化bean的方式,也是最基本的使用构造器实例化bean 1.使用构造器实例化bean:这是最简单的方式,Spring ... 
随机推荐
- struts2_20140720
			有这样的感觉:前面学的东西弄会了,过了一段时间又感觉陌生了,还要重新开始.这次想个好办法,把写的程序用博客记录下来,把自己的学历历程用博客的形式呈现出来,一来可以方便复习,而来可以以后开发程序可以快速 ... 
- fragment低版本
			http://bbs.csdn.net/topics/390271980 Fragment框架开发东西确实很方便,但是恼人的是从4.0才开始支持.以前的版本必须用兼容模式开发,本人在网上找了大量资料, ... 
- Inno Setup 安装前卸载原程序(转)
			很多時候我們需要在安裝文件之前卸載原有的程序而不是覆盖安装,本文的code就是实现了这样的功能. 实现原理是:從注冊表'UninstallString'項中读取卸载信息,用Exec进行静默卸载. 下面 ... 
- xhost
			xhost 是用来控制X server访问权限的. 通常当你从hostA登陆到hostB上运行hostB上的应用程序时,做为应用程序来说,hostA是client,但是作为图形来说,是在hostA上显 ... 
- 封装fastjson为spring mvc的json view
			可以将其中的main方法删掉.测试用的.我测试的结果是,jackson比fastjson快. fastjson是1.1.36 jackson是2.2.3 jdk是1.7.40,client cpu是i ... 
- windows窗口分析,父窗口,子窗口,所有者窗口
			(本文尝试通过一些简单的实验,来分析Windows的窗口机制,并对微软的设计理由进行一定的猜测,需要读者具备C++.Windows编程及MFC经验,还得有一定动手能力.文中可能出现一些术语不统一的现象 ... 
- NODE.JS安装配置
- 使用LINQ查询非泛型类型
			原文地址:http://www.cnblogs.com/buzz/archive/2009/04/23/1442159.html using System;using System.Collectio ... 
- 【LeetCode练习题】Merge k Sorted Lists
			Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ... 
- Windows.Server.2003.R2 简体中文企业版 x86 x64(转)
			两张盘,第二张是 R2安装盘. Windows.Server.2003.R2.With.Sp2 中文企业版[MSDN官方版本][32bit] Windows 2003.R2.With.Sp2 简体中文 ... 
