如下图所示:要将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