Android 11 低电状态栏电池图标状态&配置百分比变红流程

前面有写过一篇配置充电灯的文章,但遗留了一个问题,电池的变化是怎么样的,百分之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。

收工!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值