Jun_27.md

今日任务

  • BackgroundFadeController 分析

Que 0x01 mUpdateColors

private final OnGetTintInfo mUpdateColors = new OnGetTintInfo() {
        public void onGetTintInfo(int listType, long albumId, TintInfo tintInfo) {
            BackgroundFadeController.this.mEdgeLightningColors = new int[]{tintInfo.gradientColorA, tintInfo.gradientColorB};
            BackgroundFadeController.this.updateEdgeAnimation(BackgroundFadeController.this.mIsPlaying);
        }
    };
  • private 私有
  • final 不可继承
  • 创建了一个这样的 OnGetTintInfo,名为 mUpdateColors,并且通过构造函数实现了如下函数 onGetTintInfo
  • 其作用是为 mEdgeLightningColors 分配空间,并且调用 updateEdgeAnimation,根据分析,updateEdgeAnimation 用于更新 edge 动画(根据目前的情况来看, 应该是曲面屏边缘那个光圈)

Que 0x02 mUpdateColorsAfterRotation

private final Runnable mUpdateColorsAfterRotation = new Runnable() {
        public void run() {
            if (BackgroundFadeController.sActivityCount == 0) {
                BackgroundFadeController.this.stopEdgeLightning();
            }
        }
    };
  • Runnable 用于多线程
  • 通过构造函数实现了方法 run,其功能是调用 stopEdgeLightning 停止闪光

Que 0x03 static {}

static {
        sAppEdgeEffectInfo.setStrokeAlpha(0.8f);
        sAppEdgeEffectInfo.setRotateDuration(3000);
    }
  • static{} 语句只会在类创建的时候调用,并且仅调用一次,一般用于初始化操作
  • 这里初始化的应该是颜色深度以及边缘闪光的循环时间

Que 0x04 BackgroundFadeController

public BackgroundFadeController(Activity activity, com.samsung.android.app.music.common.mediainfo.observer.MediaChangeObservable mediaChangeObservable, MediaChangeObservable coreMediaChangeObservable) {
        this.mActivity = activity;
        this.mAlphaMask = (ImageView) activity.findViewById(R.id.blur_alpha_mask);
        if (this.mAlphaMask != null) {
            this.mNonPlayingColor = ContextCompat.getColor(activity, R.color.blur_alpha_mask);
            this.mPlayingColor = ContextCompat.getColor(activity, R.color.blur_alpha_mask_playing);
            this.mMediaChangeObservable = mediaChangeObservable;
            this.mCoreMediaChangeObservable = coreMediaChangeObservable;
            mediaChangeObservable.registerMediaChangeObserver(this);
        } else {
            this.mNonPlayingColor = 0;
            this.mPlayingColor = 0;
            this.mMediaChangeObservable = null;
            this.mCoreMediaChangeObservable = null;
        }
        this.mIsFirstMeta = true;
        sAppEdgeEffectInfo.setStrokeWidth(activity.getResources().getDimension(R.dimen.edge_lightning_stroke_width));
    }
  • 本类唯一构造函数,除了前面的初始化操作,最终调用 setStrokeWidth 设置宽度

Que 0x05 isLockScreen

private boolean isLockScreen() {
        return this.mActivity instanceof LockScreenActivity;
    }
  • 判断 mActivity 是否是 LockScreenActivity 的实例

Que 0x06 onMetaChanged

public void onMetaChanged(Meta m, PlayState s) {
        iLog.d(LOG_TAG, "onMetaChanged() called with: mIsFirstMeta = [" + this.mIsFirstMeta + "]");
        if (this.mIsFirstMeta) {
            this.mIsFirstMeta = false;
            updateFadeState(s.isPlaying, false);
        }
        this.mIsPlaying = s.isPlaying;
        updateColors(m.listType, m.albumId);
    }
  • 在构造方法中可见 mIsFirstMeta 会被设置成 true,所以会进入 if 分支
  • 在 if 分支中更新 fade 状态
  • 随后更新 mIsPlaying 状态值,并且更新色彩方案

Que 0x07 onPlayStateChanged

public void onPlayStateChanged(PlayState s) {
        iLog.d(LOG_TAG, "onPlayStateChanged() called with: s.isPlaying = [" + s.isPlaying + "]");
        if (this.mIsPlaying != s.isPlaying) {
            this.mIsPlaying = s.isPlaying;
            updateFadeState(s.isPlaying, true);
            if (s.isPlaying) {
                Meta currentMeta = this.mMediaChangeObservable.getCurrentMeta();
                updateColors(currentMeta.listType, currentMeta.albumId);
                return;
            }
            stopEdgeLightning();
        }
    }
  • 当播放状态发生改变的时候
  • 如果当前播放状态和即将改变的状态一致,则不做操作
  • 否则:
    • 更新当前播放状态
    • 更新 fade 状态
    • 如果即将改变的状态是"播放",则更新色彩方案
    • 如果即将改变的状态是"停止",则停止边缘闪光

Que 0x08 updateFadeState

private void updateFadeState(boolean isPlaying, boolean animation) {
        int startColor;
        int endColor;
        ColorDrawable color;
        iLog.d(LOG_TAG, "updateFadeState() called with: isPlaying = [" + isPlaying + "], animation = [" + animation + "]");
        if (isPlaying) {
            startColor = this.mNonPlayingColor;
            endColor = this.mPlayingColor;
        } else {
            startColor = this.mPlayingColor;
            endColor = this.mNonPlayingColor;
        }
        Drawable d = this.mAlphaMask.getDrawable();
        if (d instanceof ColorDrawable) {
            color = (ColorDrawable) d.mutate();
        } else {
            color = new ColorDrawable(startColor);
            this.mAlphaMask.setImageDrawable(color);
        }
        if (animation) {
            ValueAnimator alphaAnimation = ValueAnimator.ofArgb(new int[]{startColor, endColor}).setDuration(266);
            alphaAnimation.setInterpolator(InterpolatorSet.SINE_IN_OUT_33);
            alphaAnimation.addUpdateListener(new AnimatorUpdateListener() {
                public void onAnimationUpdate(ValueAnimator animation) {
                    color.setColor(((Integer) animation.getAnimatedValue()).intValue());
                    BackgroundFadeController.this.mAlphaMask.invalidateDrawable(color);
                }
            });
            alphaAnimation.start();
            return;
        }
        color.setColor(endColor);
        this.mAlphaMask.invalidateDrawable(color);
    }
  • getDrawable 用于获取背景图片
  • 用于改变颜色值
  • 最终分析出 updateFadeState 主要终于更改背景颜色,图片等

Que 0x09 checkEdgeLightningStopCondition

private boolean checkEdgeLightningStopCondition(boolean isPlaying) {
        if (isPlaying) {
            if ((!isLockScreen() && UiUtils.isInMultiWindowMode(this.mActivity)) || DesktopModeManagerCompat.isDesktopMode()) {
                return true;
            }
        } else if (isLockScreen() || UiUtils.isInMultiWindowMode(this.mActivity)) {
            return true;
        }
        return false;
    }
  • 判断是否满足停止边缘闪光的条件

Que 0x0A stopEdgeLightning

private void stopEdgeLightning() {
        if (sEdgeLightingController != null) {
            sEdgeLightingController.stopApplication();
        }
        sIsEdgeAnimationPlaying = false;
    }
  • 停止边缘闪光

Que 0x0B updateEdgeAnimation

private void updateEdgeAnimation(boolean isPlaying) {
        if (sEdgeLightingController == null) {
            synchronized (sEdgeLightningLock) {
                if (sEdgeLightingController == null) {
                    sEdgeLightingController = new EdgeLightingDialog(this.mActivity.getApplicationContext());
                }
            }
        }
        if (checkEdgeLightningStopCondition(isPlaying)) {
            stopEdgeLightning();
            return;
        }
        iLog.d(LOG_TAG, "updateEdgeAnimation() called with: isPlaying = [" + isPlaying + "]");
        if (isPlaying && this.mEdgeLightningColors != null) {
            if (!sIsEdgeAnimationPlaying || !Arrays.equals(this.mEdgeLightningColors, sCurrentEdgeLightningColors)) {
                sCurrentEdgeLightningColors = this.mEdgeLightningColors;
                sAppEdgeEffectInfo.setEffectColors(this.mEdgeLightningColors);
                sEdgeLightingController.startApplication(sAppEdgeEffectInfo);
                sIsEdgeAnimationPlaying = true;
            }
        }
    }
  • 更新边缘闪光状态

Que 0x0C updateColors

private void updateColors(int listType, long albumId) {
        TintColorCache.getInstance().getColor(this.mActivity, listType, albumId, this.mUpdateColors);
    }
  • 更新目标颜色

Que 0x0D 总结

如图所示:

123123123123.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,979评论 3 119
  • 2017、7、14 深圳 晴 我是日记星球第256号星宝宝希望~梅子……正在参加日记星球21天蜕变...
    梅子日记阅读 104评论 2 1
  • 那我今天讲的是一本书,叫《The Secret 秘密》-吸引力法则。我也曾推荐给一些不正经的朋友。在我看这此书...
    一号技师阅读 213评论 0 0
  • 文/七蒙主 这是最坏的年代,也是最好的年代。不破不立,总有新事物出现,颠覆我们的旧思想。 现在不是适者生存,而是强...
    七蒙主阅读 1,981评论 11 50
  • 人生那么短,既然遇到对的人,就要抓紧牵着对方的手,让一起走的日子更长些。 ——题记 (一) 那些年,陪我一起度过孤...
    耳朵在聆听阅读 650评论 0 1