`
hacker47
  • 浏览: 336269 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

AS3实例:分类订阅

 
阅读更多
其实也不知道用什么标题好,暂且叫拖动订阅吧,腾讯QQ新闻弹窗有分类个性化定制的功能,觉得挺实用的。



用AS写了个,






package  
{

	import flash.display.Sprite;
	import flash.events.MouseEvent;

	
	/**
	 * www.duowan.com
	 * @author hacker47
	 */
	[SWF(width="1000",height="600")]
	public class NewsSetting extends Sprite 
	{

		private var items:Vector.<Item>;
		private var icons:Vector.<ItemIcon>;
		
		private var selectItemNums:int = 6;
		private var itemNums:int = 15;
		
		private var startX:Number = 20;
		private var startY:Number = 200;
		private var itemWidth:Number = 80;
		
		private var currentItemInd:int;
		private var isCollision:Boolean = false;
		
		public function NewsSetting() 
		{
			icons = new Vector.<ItemIcon>();
			items = new Vector.<Item>();
			
			var i:int = 0;
			var item:Item;
			
			for (i = 0; i <= itemNums; i++ ) {
				var sx:Number;
				var sy:Number;
				if (i < selectItemNums) {
					sx = startX + i * itemWidth;
					sy = startY - 130;
				}else {
					sx = startX + (i - selectItemNums) * itemWidth;
					sy = startY;
				}
				
				item = new Item(sx, sy);
				addChild(item);
				items.push(item);
			}
			
			initItem(10);
		}
		
		
		
		private function initItem(length:int):void {
			for (var i:int = 0; i <= length; i++ ) {
				var icon:ItemIcon = new ItemIcon(i.toString());
				icon.x = items[i].x + 4;
				icon.y = items[i].y + 4;
				icon.itemIndex = i;
				addChild(icon);
				icons.push(icon);
				icon.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
			}
		}
		
		private function onDown(e:MouseEvent):void {
			var icon:ItemIcon = e.target as ItemIcon;
			//把当前对象置于最顶层
			icon.parent.setChildIndex(icon, icon.parent.numChildren - 1);
			
			icon.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
			icon.addEventListener(MouseEvent.MOUSE_UP, onUp);
		}
		
		private function onUp(e:MouseEvent):void {
			var icon:ItemIcon = e.target as ItemIcon;
			icon.stopDrag();
			icon.removeEventListener(MouseEvent.MOUSE_MOVE, onMove);
			icon.removeEventListener(MouseEvent.MOUSE_UP, onUp);
			
			if (!isCollision) {
				var item:Item 
				item= items[icon.itemIndex];
				icon.x = item.x + 4;
				icon.y = item.y + 4;
			}else {
				insertEelementToVector(currentItemInd, icon);
				orderAll();
				isCollision = false;
			}
		}
		
		private function onMove(e:MouseEvent):void {
			var icon:ItemIcon = e.target as ItemIcon;
			icon.startDrag(false);
			checkCollision(icon);
		}
		
		
		
		private function checkCollision(icon:ItemIcon):void {
			var item:Item;
			for (var i:int = 0; i < itemNums; i++ ) {
				if (icon.itemIndex == i) break;
				
				item = items[i];
				//碰撞检测
				if (icon.hitTestObject(item)) {
					if (isCollision==false) {
						isCollision = true;
						//trace("碰撞了"+i);
						//insertEelementToVector(i, icon);
						currentItemInd = i;
					}
					return ;
				}else {
					isCollision = false;
				}
			}
		}
		
		private function insertEelementToVector(index:int, element:ItemIcon):void {
			var startInd:int = element.itemIndex;
			icons.splice(index, 0, element);
			if (index > startInd) {
				icons.splice(startInd , 1);
			}else if (index < startInd) {
				icons.splice(startInd + 1, 1);
			}
			
		}
		
		
		
		private function orderAll():void {
			for (var i:int = 0; i < icons.length; i++ ) {
				icons[i].x = items[i].x + 4;
				icons[i].y = items[i].y + 4;
				icons[i].itemIndex = i;
			}

		}
		
	}

}
import com.duowan.util.DrawUtil;
import flash.display.Stage;
import flash.geom.Point;

internal class Item extends flash.display.Sprite {
	private var _width:Number=60;
	private var _height:Number=60;
	
	public function Item(x:Number, y:Number) {
		this.x = x;
		this.y = y;
		DrawUtil.drawRect(graphics, new Point(), _width, _height);
	}
	
}



package  
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.text.TextFormat;
	
	/**
	 * www.duowan.com
	 * @author hacker47
	 */
	public class ItemIcon extends Sprite 
	{
		
		public var itemIndex:int;
		
		private var txt:TextField = new TextField();
		public function ItemIcon(txtstr:String="") 
		{
			graphics.clear();
			graphics.lineStyle(1);
			graphics.beginFill(Math.random() * 0xffffff);
			graphics.drawRoundRect(0, 0, 53, 51, 5);
			graphics.endFill();
			txt.selectable = false;
			txt.mouseEnabled = false;
			txt.width = 50;
			txt.height = 50;
			//addChild(txt);  //for test
			var tf:TextFormat = new TextFormat();
			txt.text = txtstr;
			tf.align = "center";
			tf.color = 0xFF0000;
			tf.size = 30;
			
			txt.setTextFormat(tf);
			
			
		}
		
		
		
	}

}

  • 大小: 56.4 KB
  • 大小: 52.2 KB
0
1
分享到:
评论

相关推荐

    snap7连接PLCpython工程实例.zip

    snap7连接PLCpython工程实例 使用语言:python 主要功能:需要安装snap7,命令: pip install python-snap7 包含连接、读取、写入命令等 适合人群:新手及有一定经验的开发人员

    azure-xmr-mining:仅用于测试

    步骤1:前往 步骤2:注册步骤3:前往 步骤4:搜索并选择Ubuntu Server 18.04 LTS 第5步:“创建” 步骤6:遵循以下参数: 参数 初始详细信息: 订阅:Azure订阅1 资源组:XMR 实例详细信息: 虚拟机名称XMRrig ...

    经典SQL语句大全

    3、说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始 备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表...

    数据库操作语句大全(sql)

    3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 alter table tablename --添加一个自增列 ...

    sql经典语句一部分

    3、说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始 备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表...

    Microsoft SQL Server 2005 Express Edition SP3

    如果您的计算机已安装 SQL Server 2000 管理工具和 SQL Server Express 的默认实例,则可以使用 SQL Server 安装程序安装 SQL Server 2000 的默认实例。但是,这样做会禁用已安装的 SQL Server Express 实例。因此,...

    Javascript设计模式之观察者模式的多个实现版本实例

    介绍 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对...JS里对观察者模式的实现是通过回调来实现的,我们来先定义一个pubsub对象,其内部包含了3个方法:订阅、退订、发布。 代码如下: var pubsu

    ES6 javascript的异步操作实例详解

    本文实例讲述了ES6 javascript的异步操作。分享给大家供大家参考,具体如下: 异步编程对 JavaScript 语言太重要。 Javascript 语言的执行环境是“ 单线程” 的, 如果没有异步编程, 根本没法用, 非卡死不可。 ES6...

    javascript设计模式 – 观察者模式原理与用法实例分析

    本文实例讲述了javascript设计模式 – 观察者模式原理与用法。分享给大家供大家参考,具体如下: 介绍:前面我们针对系统内一对多,多对多的情况做了解决方案,是使用中介者模式,将所有关联关系交由中介者处理。这...

    求2个集合的交集

    2012-08-20 14:43:21| 分类: asp.net|举报|字号 订阅 首先定义一个hashtable Dim hstl As New Hashtable hstl.Add(key, value) 'java是用.put MS开始全面模仿java 这说说vb.net中的hashtable基本用法: 添加...

    async-injector:用于Rust的React式依赖注入

    值作为更新的提供,可以根据需要在整个应用程序中进行订阅。例子在下面的内容中,我们将展示伪造Database的注入。 这里的想法是,如果有关数据库连接的某些信息发生更改,则会创建一个新的Database实例并导致应用...

    excel导入sql2005的几种方法归纳

    数据库 2010-07-27 11:14:26 阅读201 评论0 字号:大中小 订阅 近日在巨轮着手车间负荷数据处理,反馈回来的数据是保存在Excel文件中的,我必须将其导入SQL Server2005中,供存储过程计算。 由于之前没有将Excel...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    2.4 类型的分类 37 2.4.1 值类型 37 2.4.2 引用类型 37 2.5 可空修饰符 38 2.6 数据类型之间的转换 39 2.6.1 显式转型 39 2.6.2 隐式转型 41 2.6.3 不使用转型操作符的类型转换 42 ...

    beygir:结合 redis pub-sub 和 worker-farm 的简单工作队列实现

    启动时,beygir 订阅 redis pubsub 频道,这些频道会将任务排入队列。 安装 beygir 在 npm 中可用 $ npm install beygir 快速开始 通过要求包实例化 beygir var beygir = require ( 'beygir' ) ; 然后通过使用...

    轻松学C#(图解版)

    除了详细地讲解C#知识点外,本书还提供了大量的实例,供读者实战演练。本书共分三篇。第一篇是C#概述篇,主要介绍的是Visual Studio 2012的开发环境及搭建。第二篇是面向对象基础篇,主要介绍类、对象、字段、方法、...

    feedly过滤和排序:通过高级过滤和排序功能增强feedly网站

    饲料过滤和分类启用此扩展程序/脚本后,将... 高级设置管理(从/链接导入其他订阅,在所有浏览器实例之间同步设置)。 调整页面(添加按钮以在新选项卡中打开文章,标记为已读/未读,...)。 添加着色规则以突出显示标

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    10.1.2 创建数组实例 172 10.1.3 初始化数组变量 173 10.1.4 创建隐式类型的数组 173 10.1.5 访问单独的数组元素 174 10.1.6 遍历数组 175 10.1.7 复制数组 176 10.1.8 使用多维数组 177 10.1.9 使用数组来...

    Javascript自定义事件详解

    Javascript自定义事件,其本质就是观察者模式(又称订阅/发布模式),它的好处就是将绑定事件和触发事件相互隔离开,并且可以动态的添加、删除事件。 下面通过实例,一步一步构建一个具体的Javascript自定义事件对象...

    C# 程序设计手册(WORD)

    订阅及取消订阅事件 265 发行符合 .NET Framework 方针的事件 267 在衍生类别中引发基类事件 271 实作界面事件 276 使用字典储存事件实例 280 实作自定义事件存取子 283 泛型 284 泛型简介 285 泛型的优点 287 泛型...

    原生javascript实现类似vue的数据绑定功能示例【观察者模式】

    本文实例讲述了原生javascript实现类似vue的数据绑定功能。分享给大家供大家参考,具体如下: 观察者模式 let observer = { /*订阅功能*/ addSubscriber: function (cb) { this.subscribers.push(cb); }, /*...

Global site tag (gtag.js) - Google Analytics