SystemUI原生信号塔替换为五格信号塔

如下图所示:要将Google原生的一体化信号塔图标客制化成珊格状图标,相关代码流程:

原生信号塔如下图所示:

客制化五格信号塔示意图:

原生方案信号塔是用SignalDrawable 根据当前信号强度mSignalStrength绘制出来的,替换方案为要使用对应的xml文件替换成当前的信号强度。

1.当手机信号强度发生改变时,会回掉:

/home/android/code/U304_0322/android/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java

class MobilePhoneStateListener extends PhoneStateListener {
    public MobilePhoneStateListener(int subId, Looper looper) {
        super(subId, looper);
    }
    @Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        if (DEBUG) {
            Log.d(mTag, "onSignalStrengthsChanged signalStrength=" + signalStrength +
                    ((signalStrength == null) ? "" : (" level=" + signalStrength.getLevel())));
        }
        mSignalStrength = signalStrength;
        updateTelephony();
    }
    ......
}

该信号强度值会被封装传递到信号塔强度变化更新处进行刷新:

/home/android/code/U304_0322/android/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java

private void updateState(MobileIconState state) {
    setContentDescription(state.contentDescription);
    if (mState.visible != state.visible) {
        mMobileGroup.setVisibility(state.visible ? View.VISIBLE : View.GONE);
        requestLayout();
    }
    //信号强度发生改变,刷新图标
    if (mState.strengthId != state.strengthId) {
        //mMobileDrawable.setLevel(state.strengthId); //原生
        mMobile.setImageDrawable(getSignalIcon(state.strengthId));//替换方案
        // TINNO END
    }
    ......
}
private static final int STATE_NONE = 0;//数据开关关闭
private static final int STATE_EMPTY = 1;
private static final int STATE_CUT = 2;//数据开关打开
private static final int LEVEL_MASK = 0xff;
private static final int STATE_SHIFT = 16;
private static final int STATE_MASK = 0xff << STATE_SHIFT;
private Drawable getSignalIcon(int strengthId) {
    int state = (strengthId & STATE_MASK) >> STATE_SHIFT;
    int level = strengthId & LEVEL_MASK;
    int signalRes = R.drawable.ic_qs_5bar_signal_0;
    if (state == STATE_EMPTY) {//No Service
        signalRes = R.drawable.ic_qs_5bar_signal_no_service;
    } else if (state == STATE_NONE || state == STATE_CUT) {
        switch (level) {
            case 0:
                signalRes = state == STATE_NONE ? R.drawable.ic_qs_5bar_signal_full_1
                        : R.drawable.ic_qs_5bar_signal_1;
                break;
            case 1:signalRes = state == STATE_NONE ? R.drawable.ic_qs_5bar_signal_full_2
                        : R.drawable.ic_qs_5bar_signal_2;
                break;
            case 2:
                signalRes = state == STATE_NONE ? R.drawable.ic_qs_5bar_signal_full_3
                        : R.drawable.ic_qs_5bar_signal_3;
                break;
            case 3:
                signalRes = state == STATE_NONE ? R.drawable.ic_qs_5bar_signal_full_4
                        : R.drawable.ic_qs_5bar_signal_4;
                break;
            case 4:
                signalRes = state == STATE_NONE ? R.drawable.ic_qs_5bar_signal_full_5
                        : R.drawable.ic_qs_5bar_signal_5;
                break;
            default:
                signalRes = state == STATE_NONE ? R.drawable.ic_qs_5bar_signal_full_0
                        : R.drawable.ic_qs_5bar_signal_0;
                break;
        }
    }
    return getContext().getResources().getDrawable(signalRes);
}

对应的五格信号图标资源文件:

https://download.csdn.net/download/tj_shenzhendaxue/11156001

猜你喜欢

转载自blog.csdn.net/tj_shenzhendaxue/article/details/89742635