Egret -- 颜色缓动(使用Tween更改fillColor值闪烁)

如果我们想将一个Rect的颜色从ColorA变换为ColorB,而且是缓动变换的,使用如下方法会发生闪烁问题:

/** 颜色变化 */
    public colorTo(target: eui.Rect, targetColor: number, duration: number, delay: number, callback = null) {
        egret.Tween.get(target).wait(delay).to({fillColor: targetColor}, duration);
     }

这里写图片描述
发生闪烁原理,该Tween是将Target的fillColor值从ColorA改变到ColorB,这个过程中RGB值是混乱的,所以发生了闪烁,正确做法是分别更改颜色的RGB值到目标RGB值就不会发生闪烁。

自己写一个缓动方法:


    /** 颜色变化 */
    public colorTo(target: eui.Rect, targetColor: number, duration: number, delay: number, callback = null) {
        // 将16进制颜色分割成rgb值
        let spliceColor = (color) => {
            let result = {r: -1, g: -1, b: -1};
            result.b = color % 256;
            result.g = Math.floor((color / 256)) % 256;
            result.r = Math.floor((color / 256) / 256);
            return result;
        }

        // 将rgb值合并成颜色值
        let mergeColor = (rgb: {r: number, g: number, b: number}) => {
            return Math.floor(((rgb.r * 256) + rgb.g) * 256 + rgb.b);
        }

        // 目标rgb值
        let targetRGB = spliceColor(targetColor);
        // 当前rgb值
        let curRGB = spliceColor(target.fillColor);
        // 单帧时间,当前使用30帧每秒来运行
        let deltaTime = 1000 / 30;
        let timer = 0;
        // target.fillColor = targetColor;
        egret.Tween.get(target).wait(delay).call(function(){
            let roopCount = duration / deltaTime;
            let disR = Math.floor((targetRGB.r - curRGB.r) / roopCount);
            let disG = Math.floor((targetRGB.g - curRGB.g) / roopCount);
            let disB = Math.floor((targetRGB.b - curRGB.b) / roopCount);

            let interval = egret.setInterval(function(){
                timer += deltaTime;
                if(timer < duration){
                    curRGB = {r: curRGB.r + disR, g: curRGB.g + disG, b: curRGB.b + disB};
                    console.log(curRGB);
                    target.fillColor = mergeColor(curRGB);
                } else {
                    target.fillColor = targetColor;
                    egret.clearInterval(interval);
                    if(callback) {
                        callback();
                    }
                }
            }, this, deltaTime);
        });
    }

拿走不谢。
效果:这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值