• Android10 状态栏蓝牙电量图标


    Android10 源码状态栏蓝牙电量图标相关类

    BatteryMeterDrawableBase:电量图标基类

    BluetoothDeviceLayerDrawable: LayerDrawable 包含蓝牙设备图标和电池电量图标

            BatteryMeterDrawable:内部类,继承自BatteryMeterDrawableBase

            BluetoothDeviceLayerDrawableState:内部类,继承自ConstantState

    电量图标

    电量图标由BatteryMeterDrawableBase绘制,虽然BluetoothDeviceLayerDrawable的内部类BatteryMeterDrawable继承自BatteryMeterDrawableBase,但并没有重写太多东西

    1. public BatteryMeterDrawableBase(Context context, int frameColor) {
    2. mContext = context;
    3. final Resources res = context.getResources();
    4. TypedArray levels = res.obtainTypedArray(R.array.batterymeter_color_levels); //15、100
    5. TypedArray colors = res.obtainTypedArray(R.array.batterymeter_color_values); //红色、白色
    6. final int N = levels.length();
    7. mColors = new int[2 * N];
    8. for (int i = 0; i < N; i++) {
    9. mColors[2 * i] = levels.getInt(i, 0);
    10. if (colors.getType(i) == TypedValue.TYPE_ATTRIBUTE) {
    11. mColors[2 * i + 1] = Utils.getColorAttrDefaultColor(context,
    12. colors.getThemeAttributeId(i, 0));
    13. } else {
    14. mColors[2 * i + 1] = colors.getColor(i, 0);
    15. }
    16. }
    17. levels.recycle(); //回收资源
    18. colors.recycle();
    19. mWarningString = context.getString(R.string.battery_meter_very_low_overlay_symbol);
    20. mCriticalLevel = mContext.getResources().getInteger(
    21. com.android.internal.R.integer.config_criticalBatteryWarningLevel); //=5:临界电量值
    22. mButtonHeightFraction = context.getResources().getFraction(
    23. R.fraction.battery_button_height_fraction, 1, 1); //高度百分比
    24. mSubpixelSmoothingLeft = context.getResources().getFraction( //不知道是什么,也没被调用
    25. R.fraction.battery_subpixel_smoothing_left, 1, 1);
    26. mSubpixelSmoothingRight = context.getResources().getFraction( //不知道是什么,也没被调用
    27. R.fraction.battery_subpixel_smoothing_right, 1, 1);
    28. ......
    29. }

     想要修改什么,修改对应的资源值就好。

    整合

    由BluetoothDeviceLayerDrawable将蓝牙图标放在左边,电量图标放在右边。

    BluetoothDeviceLayerDrawable的构造函数是私有的,通过createLayerDrawable方法获取实例对象。

    1. public static BluetoothDeviceLayerDrawable createLayerDrawable(Context context, int resId,
    2. int batteryLevel, float iconScale) {
    3. final Drawable deviceDrawable = context.getDrawable(resId);
    4. final BatteryMeterDrawable batteryDrawable = new BatteryMeterDrawable(context,
    5. context.getColor(R.color.meter_background_color), batteryLevel);
    6. final int pad = context.getResources().getDimensionPixelSize(R.dimen.bt_battery_padding);
    7. batteryDrawable.setPadding(pad, pad, pad, pad);
    8. //创建
    9. final BluetoothDeviceLayerDrawable drawable = new BluetoothDeviceLayerDrawable(
    10. new Drawable[]{deviceDrawable, batteryDrawable}); //图层
    11. // Set the bluetooth icon at the left
    12. drawable.setLayerGravity(0 /* index of deviceDrawable */, Gravity.START); //蓝牙图标
    13. // Set battery icon to the right of the bluetooth icon
    14. //下面两句确认电量图标绘制的其实像素点(x,y)=(deviceDrawable.getIntrinsicWidth(),deviceDrawable.getIntrinsicHeight() * (1 - iconScale))
    15. drawable.setLayerInsetStart(1 /* index of batteryDrawable */,
    16. deviceDrawable.getIntrinsicWidth()); //电量图标
    17. drawable.setLayerInsetTop(1 /* index of batteryDrawable */,
    18. (int) (deviceDrawable.getIntrinsicHeight() * (1 - iconScale)));
    19. drawable.setConstantState(context, resId, batteryLevel, iconScale);
    20. return drawable;
    21. }

  • 相关阅读:
    mysql基础面试题
    C++:重定义:符号重定义:变量重定义(三):解决变量重定义(声明extern外部变量)
    这五个适合上班族的副业你知道多少
    机器学习笔记之线性回归
    UDP主要丢包原因及具体问题分析
    HTTP常见面试题(小林coding版总结)
    pandas数据分析综合练习50题 - 地区房价分析
    Oracle Primavera Unifier 23.6 新特征
    一篇五分生信临床模型预测文章代码复现——Figure1 差异表达基因及预后基因筛选——预后相关基因筛选及森林图绘制(三)
    行业资讯 | 深圳:BIM法定化,开历史之先河
  • 原文地址:https://blog.csdn.net/lxjlxj2333/article/details/134380723