`
hacker47
  • 浏览: 340439 次
  • 性别: 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
分享到:
评论

相关推荐

    23种设计模式实例及说明大全(as3语言描述)

    ActionScript 3(AS3)是Adobe Flash平台的主要编程语言,它也广泛应用于富互联网应用(RIA)的开发。在AS3中理解和应用设计模式,能提升代码的可读性、可维护性和可扩展性。以下将详细介绍这23种设计模式,并结合AS...

    Flash as3 Rss

    综上所述,Flash AS3 Rss项目涵盖了从网络加载数据、解析XML、设计用户界面到实现动态效果等多个方面,是AS3开发中的一个综合性实例。通过这样的项目,开发者可以学习和掌握多种实用的编程和设计技巧。

    简单的时钟 as3 MVC

    【时钟MVC】是一个基于ActionScript 3 (AS3) 实现的简单时钟应用程序,采用模型-视图-控制器(MVC)设计模式。这个项目对于初学者理解MVC架构及其在AS3中的应用非常有帮助。下面将详细解释MVC模式以及在AS3中的实现...

    SaaS软件即服务系列课程(4):SaaS的应用实例

    SaaS(Software as a Service,软件即服务)是一种云计算模型,它提供了通过互联网访问和使用的软件应用。本课程聚焦于SaaS的实际应用场景,旨在深入理解SaaS如何在不同行业中发挥效能。以下是关于SaaS的详细知识点...

    AS3.0 MVC框架

    3. **观察者模式**:模型组件通过观察者模式发布通知,使得其他组件可以订阅并响应这些变化。 4. **命令模式**:Controller使用命令模式处理事件,每个命令都是一个单独的类,降低了代码耦合度。 5. **简单易用**:...

    PureMVC_AS3 開發資料

    《PureMVC AS3 开发资料详解》 PureMVC AS3 是一款强大的、轻量级的、基于观察者模式的MVC(Model-View-Controller)框架,它专为Adobe ActionScript 3 (AS3) 设计。该框架旨在提供一种结构化的编程方式,使开发...

    Flex puremvc 实例及说明(flex 4.6开发环境)

    PureMVC是用AS3编写的轻量级框架,它将业务逻辑、用户界面和应用数据分离,以提高代码的可重用性和可测试性。它提供了一组抽象接口,包括Model、View和Controller,以及它们之间的协调器(Mediator)、观察者...

    snap7连接PLCpython工程实例.zip

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

    SaaS软件即服务系列课程(3):SaaS在企业中的应用

    **SaaS软件即服务系列课程(3):SaaS在企业中的应用** SaaS(Software as a Service)是一种云计算模型,它将软件应用程序作为一种服务提供给用户,通过互联网进行访问和使用,而不是传统意义上的本地安装。这个系列...

    swift-QTEventBus是一个优雅的iOS事件总线用来实现“发布-订阅”的消息通信模式

    3. **发布事件**:当需要广播事件时,只需要调用`publish`方法,传入创建的事件实例。事件总线会自动找到所有订阅了该事件的订阅者并执行它们的回调。 ```swift func performLogin() { // 登录逻辑... let ...

    websocket-server

    总结起来,这个"websocket-server"项目是一个利用Spring Boot集成WebSocket技术的实例,展示了如何在服务端实现主动推送数据到前端的功能。通过理解并实践该项目,开发者可以深入掌握WebSocket的使用,以及如何在...

    asny.rar_c# asny_winform

    在“asny.rar_c# asny_winform”项目中,我们看到的是一个关于C# Winform异步操作的实例,利用Visual Studio 2008进行开发。这个实例可能包含两个主要部分:asnyServer和asnyClient,分别代表服务器端和服务客户端的...

    ejb3.0实例教程

    ### EJB 3.0 实例教程:深入解析与实践指南 #### 一、引言:EJB 3.0 的重要性与适用人群 EJB(Enterprise JavaBeans)是Java平台上的服务器端组件模型,它允许开发者创建可重用的企业级应用程序组件。EJB 3.0作为...

    Oracle9iAS Portal宝典(PG)

    Portlets是Oracle9iAS Portal的一大特色,它们是可重用的、自包含的小型Web应用,可以嵌入到门户页面中,提供各种功能,如新闻订阅、日历管理、搜索等。开发者可以使用JavaServer Pages (JSP)、Java Servlets或Web ...

    azure-xmr-mining:仅用于测试

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

    edna实时数据库SDK函数VB编程实例

    同时,EDNA SDK可能还包括其他高级功能,如数据订阅、实时数据流处理等,开发者可以根据需求进一步学习和利用。 在实际项目中,开发者通常需要结合VB的控件和窗体设计,创建用户友好的界面,使用户能够直观地查看、...

    flex通信之BlazeDS通信实例源码

    3. **Messaging**:BlazeDS支持发布/订阅模型的消息传递,使客户端能实时接收服务器推送的数据更新,实现事件驱动的通信。 4. **数据管理**:通过使用Flex Data Services,可以轻松地在Flex客户端和Java应用之间...

    消息中心应用实例

    在“消息中心应用实例”中,我们将探讨如何利用消息中心来实现在不同视图之间的平滑切换,从而简化视图间的依赖关系,提高代码的可维护性和可扩展性。 首先,消息中心(NSNotificationCenter)是Foundation框架的一...

    C#版本EventBus事件总线实例源码

    3. **实现EventBus类**:EventBus类将负责事件的发布和订阅。它通常包含两个主要方法:`Subscribe&lt;T&gt;`和`Publish&lt;T&gt;`,分别用于订阅和发布事件。 ```csharp public class EventBus { private readonly Dictionary,...

    Jboss EJB3.0 实例教程.pdf

    - **主题消息**:基于发布/订阅(Pub/Sub)的消息传递模型。 #### 六、实体Bean (Entity Bean) - **持久化配置**:`persistence.xml`文件是EJB 3.0实体Bean的重要配置文件之一,用于指定持久化单元。 - **数据源...

Global site tag (gtag.js) - Google Analytics