namespace byh {
/**
* 环形组件
*/
export class ComRingScroller extends egret.EventDispatcher {
public static create(itemArr: any[], offX: number = 0): ComRingScroller {
let ring = new ComRingScroller();
ring.init(itemArr, offX);
return ring;
}
private items: ComRingVo[];
public vo: ComRingVo;
private startX: number;
private totalOffX: number;
private currOffX: number;
private isTween: boolean;
public init(itemArr: egret.DisplayObject[], offX: number = 0) {
let s = this;
s.items = [];
for (let i: number = 0; i < itemArr.length; i++) {
let item = itemArr[i];
let vo = new ComRingVo;
vo.parse(item);
s.items.push(vo);
if (!s.vo) {
s.vo = vo;
}
}
s.totalOffX = offX ? offX : s.vo.item.width / 2;
for (let i: number = 0; i < s.items.length; i++) {
let vo = s.items[i];
vo.prevVo = i - 1 >= 0 ? s.items[i - 1] : s.items[s.items.length - 1];
vo.nextVo = i + 1 <= s.items.length - 1 ? s.items[i + 1] : s.items[0];
}
s.addEvent();
}
public addEvent(): void {
let s = this;
if (s.vo) {
s.vo.item.parent.on(egret.TouchEvent.TOUCH_BEGIN, s.onTouchBegin, s);
}
}
public removeEvent(): void {
let s = this;
if (s.vo) {
s.vo.item.parent.off(egret.TouchEvent.TOUCH_BEGIN, s.onTouchBegin, s);
}
}
private onTouchBegin(e: egret.TouchEvent): void {
let s = this;
s.startX = e.stageX;
s.vo.item.parent.on(egret.TouchEvent.TOUCH_MOVE, s.onTouchMove, s);
s.vo.item.stage.on(egret.TouchEvent.TOUCH_END, s.onTouchEnd, s);
}
private onTouchEnd(e: egret.TouchEvent): void {
let s = this;
if (s.isTween) {
return;
}
if (s.vo.x == s.vo.item.x) {
return;
}
let tm: number = Math.abs(s.vo.x - s.vo.item.x) < 5 ? 0 : 200;
s.vo.item.parent.off(egret.TouchEvent.TOUCH_MOVE, s.onTouchMove, s);
s.vo.item.stage.off(egret.TouchEvent.TOUCH_END, s.onTouchEnd, s);
if (Math.abs(s.vo.x - s.vo.item.x) < s.totalOffX) {
for (let vo of s.items) {
egret.Tween.get(vo.item).to({ x: vo.x, y: vo.y }, tm);
}
}
}
private onTouchMove(e: egret.TouchEvent): void {
let s = this;
if (s.isTween || !s.startX) {
return;
}
s.currOffX = e.stageX - s.startX;
s.setItemPoint();
}
private setItemPoint(): void {
let s = this;
if (Math.abs(s.currOffX) > s.vo.item.width) {
return;
}
if (s.currOffX != s.vo.x) {
s.vo.item.x = s.vo.x + s.currOffX;
s.vo.prevVo.item.x = s.vo.prevVo.x - s.currOffX;
s.vo.nextVo.item.x = s.vo.nextVo.x - s.currOffX;
if (Math.abs(s.vo.x - s.vo.item.x) >= s.totalOffX) {
s.isTween = true;
if (s.currOffX < 0) {
s.vo.prevVo.item.removeSelf();
s.vo.item.parent.addChildAt(s.vo.prevVo.item, s.vo.item.parent.numChildren);
}
else {
s.vo.nextVo.item.removeSelf();
s.vo.item.parent.addChildAt(s.vo.nextVo.item, s.vo.item.parent.numChildren);
}
for (let vo of s.items) {
if (s.currOffX > 0) {
egret.Tween.get(vo.item).to({ x: vo.prevVo.x, y: vo.prevVo.y, rotation: vo.prevVo.rotation, scaleX: vo.prevVo.scaleX, scaleY: vo.prevVo.scaleY }, 300).call(onComplete, s, [vo]);
egret.Tween.get(vo.item["img_alpha"]).to({ alpha: vo.prevVo.item["img_alpha"].alpha }, 200);
}
else {
egret.Tween.get(vo.item).to({ x: vo.nextVo.x, y: vo.nextVo.y, rotation: vo.nextVo.rotation, scaleX: vo.nextVo.scaleX, scaleY: vo.nextVo.scaleY }, 300).call(onComplete, s, [vo]);
egret.Tween.get(vo.item["img_alpha"]).to({ alpha: vo.nextVo.item["img_alpha"].alpha }, 200);
}
}
}
}
function onComplete(vo: ComRingVo) {
let s = this;
vo.parse(vo.item);
if (s.isTween) {
s.isTween = false;
if (s.currOffX < 0) {
s.vo = s.vo.prevVo;
}
else {
s.vo = s.vo.nextVo;
}
s.vo.item["img_alpha"].touchEnabled = false;
s.vo.prevVo.item["img_alpha"].touchEnabled = true;
s.vo.nextVo.item["img_alpha"].touchEnabled = true;
s.startX = 0;
s.dispatchEventWith(egret.Event.CHANGE, true, s.vo.item);
}
}
}
public dispose(): void {
let s = this;
s.removeEvent();
}
}
export class ComRingVo {
public item: egret.DisplayObject;
public prevVo: ComRingVo;
public nextVo: ComRingVo;
public x: number;
public y: number;
public scaleX: number;
public scaleY: number;
public rotation: number;
public parse(item: egret.DisplayObject): void {
let s = this;
s.item = item;
s.x = item.x;
s.y = item.y;
s.scaleX = item.scaleX;
s.scaleY = item.scaleY;
s.rotation = item.rotation;
}
}
}