前面有写过一篇配置充电灯的文章,但遗留了一个问题,电池的变化是怎么样的,百分之15绘图变红改成百分之20要怎么做?于是便边查前人写的文章边自己寻找代码逻辑。
电池图标
MTK平台,源码路径在vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/BatteryMeterView.java。
batteryMeterView的构造方法分别对百分比显示,角度,色调,pixel等资源配置进行描述。
setOrientation(LinearLayout.HORIZONTAL);//**方向**
setGravity(Gravity.CENTER_VERTICAL | Gravity.START);//**角度**
TypedArray atts = context.obtainStyledAttributes(attrs, R.styleable.BatteryMeterView,
defStyle, 0);
final int frameColor = atts.getColor(R.styleable.BatteryMeterView_frameColor,
context.getColor(R.color.meter_background_color));
mPercentageStyleId = atts.getResourceId(R.styleable.BatteryMeterView_textAppearance, 0);
mDrawable = new ThemedBatteryDrawable(context, frameColor);
atts.recycle();
mSettingObserver = new SettingObserver(new Handler(context.getMainLooper()));
mShowPercentAvailable = context.getResources().getBoolean(
com.android.internal.R.bool.config_battery_percentage_setting_available);//百分比配置
addOnAttachStateChangeListener(
new DisableStateTracker(DISABLE_NONE, DISABLE2_SYSTEM_ICONS,
Dependency.get(CommandQueue.class)));
setupLayoutTransition();
mSlotBattery = context.getString(
com.android.internal.R.string.status_bar_battery);
mBatteryIconView = new ImageView(context);
mBatteryIconView.setImageDrawable(mDrawable);
final MarginLayoutParams mlp = new MarginLayoutParams(
getResources().getDimensionPixelSize(R.dimen.status_bar_battery_icon_width),
getResources().getDimensionPixelSize(R.dimen.status_bar_battery_icon_height));//width-height
onBatteryLevelChanged在电量发生改变时调用,包括监听是否充电,Level,百分比等实时变化。
public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
// M: In case battery protection, it may stop charging even when plugged.
// For example, it will stop charging if over 50 degrees.
mDrawable.setCharging(pluggedIn && charging);
mDrawable.setBatteryLevel(level);
mCharging = pluggedIn && charging;
mLevel = level;
updatePercentText();
}
android.provider.Settings.System.SHOW_BATTERY_PERCENT;属性可以通过在SettingsProvider预添加default值以及Load datebase加载,默认提供SystemUI电池百分比显示。
绘制规则
之前没做过相应了解,一直认为color等配置也在systemui内部,查找了一会,没看到实现的地方,最终在import里找到了提示,com.android.settingslib.graph.xxxx。这不是Settingslib么,于是乎在frameworks/base/packages/SettingsLib内搜索,找到了BatteryMeterView的配置参数。
路径:frameworks/base/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
在public void draw(Canvas c)接口内分别实现了battery body,level,ShapePath,Text,color以及是否充电中判断分别绘制对应外观。而在类初始配置了batterymeter_color_levels,这不就是我想要的么,真是纵里寻它千百度啊…
public BatteryMeterDrawableBase(Context context, int frameColor) {
mContext = context;
final Resources res = context.getResources();
TypedArray levels = res.obtainTypedArray(R.array.batterymeter_color_levels);//定义位置
TypedArray colors = res.obtainTypedArray(R.array.batterymeter_color_values);
final int N = levels.length();
mColors = new int[2 * N];
for (int i = 0; i < N; i++) {
mColors[2 * i] = levels.getInt(i, 0);
if (colors.getType(i) == TypedValue.TYPE_ATTRIBUTE) {
mColors[2 * i + 1] = Utils.getColorAttrDefaultColor(context,
colors.getThemeAttributeId(i, 0));
} else {
mColors[2 * i + 1] = colors.getColor(i, 0);
}
}
levels.recycle();
colors.recycle();
于是在资源文件里进行如下修改:
diff --git a/frameworks/base/packages/SettingsLib/res/values/arrays.xml b/frameworks/base/packages/SettingsLib/res/values/arrays.xml
index d59d698efba..e842676783e 100644
--- a/frameworks/base/packages/SettingsLib/res/values/arrays.xml
+++ b/frameworks/base/packages/SettingsLib/res/values/arrays.xml
@@ -580,7 +580,7 @@
<!-- BatteryMeterView parameters -->
<array name="batterymeter_color_levels">
- <item>15</item>
+ <item>20</item>
<item>100</item>
</array>
<array name="batterymeter_color_values">
diff --git a/frameworks/base/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt b/frameworks/base/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt
index a5b5312707d..ded84850b84 100644
--- a/frameworks/base/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt
+++ b/frameworks/base/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt
@@ -414,7 +414,7 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int)
private const val TAG = "ThemedBatteryDrawable"
private const val WIDTH = 12f
private const val HEIGHT = 20f
- private const val CRITICAL_LEVEL = 15
+ private const val CRITICAL_LEVEL = 20
// On a 12x20 grid, how wide to make the fill protection stroke.
// Scales when our size changes
private const val PROTECTION_STROKE_WIDTH = 3f
编译烧录,到百分之20正常变红,这里提一嘴,config_lowBatteryWarningLevel控制指示灯以及通知,位于frameworks/base/core/res/res/values/config.xml。