AS3实例:分类订阅

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

[img]http://dl.iteye.com/upload/attachment/0066/1706/bf5f9edb-284a-349a-87ac-0eda445eca78.jpg[/img]

用AS写了个,


[img]http://dl.iteye.com/upload/attachment/0066/1708/5677ca4f-2def-3405-9760-7ccb4558d61c.jpg[/img]




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);


}



}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值