通用按钮监听

 

初衷是让每一个按钮都有按钮声音和动画效果。

如果在每个按钮addEventListener(egret.Event.Touch_tap)里播放声音和动画,则非常麻烦。

所以修改了按钮就的监听方式

btn.addEventListener(egret.TouchEvent.TOUCH_TAP, cb, this);

改成

CommonBtn.addClick(btn, cb, this, 1);

 

 

/**
 * @author chenkai
 * @since 2017/11/8
 */
class CommomBtn {
    //事件列表
    private static eventList = {};

    /**
     * 注册按钮点击事件
     * @param target 按钮
     * @param cb     点击回调
     * @param thisObject 执行对象
     * @param type 声音播放类型  1普通点击  2退出   3换页
     */
    public static addClick(target:any, cb:Function, thisObject:any, type = 1) {
        let list:Array<any> = this.eventList[target.hashCode + ""];

        if(list == null){
            list = new Array<any>();
            this.eventList[target.hashCode + ""] = list;
        }
        let len = list.length;
        for(var i=0;i<len;i++){
            if(list[i][0] == cb && list[i][1] == thisObject){
                return;
            }
        }
        var btnClick:BtnClick = new BtnClick(target, cb, thisObject, type);
        list.push([cb, thisObject, btnClick]);
    }

    /**
     * 移除按钮点击事件
     * @param target 按钮
     * @param cb 点击回调
     * @param thisObject 执行对象
     */
    public static removeClick(target:any, cb:Function, thisObject:any){
        let list:Array<any> = this.eventList[target.hashCode + ""];
        if(list != null){
            let len = list.length;
            for(let i=len-1;i>=0;i--){
                if(list[i][0] == cb && list[i][1] == thisObject){
                    let btnClick:BtnClick = list[i][2];
                    btnClick.destoryMe();
                    list[i].length = 0;
                    list.splice(i,1);
                }
            }
        }
    }
}



class BtnClick{
    private type:number;
    private target:any;
    private thisObject:any;
    private cb:Function;

    public constructor(target:any, cb:Function, thisObject:any, type:number = 1){
        this.target = target;
        this.cb = cb;
        this.thisObject = thisObject;
        this.type = type;

        this.target.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onTouchBegin, this);
        this.target.addEventListener(egret.TouchEvent.TOUCH_TAP, this.onTouchTap, this);
    }

    //触摸开始,播放声音和扩展动画
    private onTouchBegin(){
        App.StageUtils.stage.addEventListener(egret.TouchEvent.TOUCH_END, this.onTouchEnd, this);
        this.initAnchorOffset();
        this.playSound();
        this.playOutAnim(); 
    }

    //点击,执行回调
    private onTouchTap(){
        this.cb.apply(this.thisObject);
    }

    //触摸释放,播放收缩动画
    private onTouchEnd(){
        this.playBackAnim();
        App.StageUtils.stage.removeEventListener(egret.TouchEvent.TOUCH_END, this.onTouchEnd, this);
    }

    //播放声音
    private playSound(){
        switch (this.type) {
            case 1:
                App.SoundManager.playEffect(SoundID.click);
                break;
            case 2:
                //App.SoundManager.playEffect(SoundManager.close);
                break;
            case 3:
                //App.SoundManager.playEffect(SoundManager.page_switch);
                break;
        }
    }

    //播放扩展动画
    private playOutAnim(){
        egret.Tween.get(this.target).set({ scaleX: 1, scaleY: 1 }).to({ scaleX: 1.05, scaleY: 1.05 },30);
    }

    //播放收缩动画
    private playBackAnim(){
        egret.Tween.get(this.target).to({ scaleX: 1, scaleY: 1 },30);
    }

    //设置锚点为中心
    private initAnchorOffset(){
        if(this.target.anchorOffsetX != this.target.width/2 && this.target.anchorOffsetY != this.target.height/2){
            this.target.anchorOffsetX = this.target.width / 2;
            this.target.anchorOffsetY = this.target.height / 2;
            this.target.x = this.target.x + this.target.width / 2;
            this.target.y = this.target.y + this.target.height / 2;
        }
    }

    //销毁
    public destoryMe(){
        this.target.scaleX = 1;
        this.target.scaleY = 1;
        egret.Tween.removeTweens(this.target);
        this.target.removeEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onTouchBegin, this);
        this.target.removeEventListener(egret.TouchEvent.TOUCH_TAP, this.onTouchTap, this);
        App.StageUtils.stage.removeEventListener(egret.TouchEvent.TOUCH_END, this.onTouchEnd, this);
        this.target = null;
        this.cb = null;
        this.thisObject = null;
    }
}
 

 

转载于:https://www.cnblogs.com/gamedaybyday/p/7792751.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值