一、图片的问题
statusrbar left icon
/frameworks/base / packages/SystemUI/res/values/dimens.xml
<!-- size at which Notification icons will be drawn in the status bar -->
<dimen name="status_bar_icon_drawing_size">14dp</dimen>
<!-- the padding on the start of the statusbar -->
<dimen name="status_bar_padding_start">6dp</dimen>
/frameworks/base / packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
private void updateIconScaleDimens() {
//status_bar_icon_size
mStatusBarIconSize = res.getDimensionPixelSize(R.dimen.notification_icon_view_width);
}
/frameworks/base / packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
private void reloadDimens(Context context) {
//status_bar_icon_size
mIconSize = res.getDimensionPixelSize(R.dimen.notification_icon_view_width);
}
android 原生的图标 状态栏 24dp - 48px
drawable - 24 x 24 矢量图(android:viewportWidth="24" android:viewportHeight="24")
xhdpi - 48 x 48
xxhdpi - 72 x 72
xxxhdpi - 96 x 96
二、美工如果按照效果图切图比如: xhdpi 1280-720(stat_h - 24dp /48px) -- 可能会切的效果图 36px icon_h
2.1 System Icon
SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
图标缩放比例: private static final float SYSTEM_ICON_SCALE
图标大小:
添加padding:
SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
(1)
protected StatusBarIconView addIcon
protected StatusBarWifiView addSignalIcon
protected StatusBarMobileView addMobileIcon
添加 padding
int padding = mContext.getResources().getDimensionPixelSize(R.dimen.status_bar_icon_padding);
view.setPadding(padding,0,padding,0);
PS: 一开始在方法
protected LinearLayout.LayoutParams onCreateLayoutParams() {
中设置了 padding 不知道为何没有生效
(2)
system icon 黑名单:
public static final String ICON_BLACKLIST = "icon_blacklist";
public static ArraySet<String> getIconBlacklist(String blackListStr) {
ArraySet<String> ret = new ArraySet<>();
if (blackListStr == null) {
//blackListStr = "rotate,headset";
}
String[] blacklist = blackListStr.split(",");
for (String slot : blacklist) {
if (!TextUtils.isEmpty(slot)) {
ret.add(slot);
}
}
return ret;
}
2.2 通知图标
SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
private float mIconScale ---> 控制通知的图标比例
SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
绘制大小
private void updateIconScaleDimens() {
Resources res = mContext.getResources();
mStatusBarIconSize = res.getDimensionPixelSize(R.dimen.status_bar_icon_size);
mStatusBarIconDrawingSizeDark =
res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size_dark);
mStatusBarIconDrawingSize =
res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size);
updateIconScale();
}
三、图片的更改 PhoneStatusBarPolicy.java (系统的图标种类关键字 stat_sys)
蓝牙 stat_sys_data_bluetooth.xml stat_sys_data_bluetooth_connected.xml
vpn stat_sys_branded_vpn.xml stat_sys_vpn_ic.xml
勿扰 stat_sys_dnd.xml
热点 stat_sys_hotspot.xml
定位 stat_sys_location.xml
静音 stat_sys_ringer_silent.xml
震动 stat_sys_ringer_vibrate.xml
飞行模式 stat_sys_airplane_mode.xml
投影 stat_sys_cast.xml
闹钟 stat_sys_alarm
无sim卡 stat_sys_no_sims (高版本上未显示)
stat_sys_tty_mode
禅模式 stat_sys_zen_none stat_sys_alarm_dim stat_sys_zen_important
stat_sys_data_saver
有线网络 stat_sys_ethernet_fully.xml stat_sys_ethernet.xml
无线网
stat_sys_wifi_signal_0.xml stat_sys_wifi_signal_0_fully.xml
stat_sys_wifi_in.xml stat_sys_wifi_out
信号
stat_sys_signal_in stat_sys_signal_out
3g 4g 等标识
8.0 之后 StatusBarSignalPolicy.java
8.0 之前 SignalClusterView.java
自己定义可使用图片
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:systemui="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res/
com.android.email" android:src="@drawable/stat_sys_signal_in"/>
//流量上下
private int getCardActivityId(boolean activityIn, boolean activityOut) {
int activityId;
if (activityIn && activityOut) {
activityId = R.drawable.stat_sys_signal_inout_auto_mirrored;
} else if (activityIn) {
activityId = R.drawable.stat_sys_signal_in_auto_mirrored;
} else if (activityOut) {
activityId = R.drawable.stat_sys_signal_out_auto_mirrored;
} else {
activityId = R.drawable.stat_sys_signal_no_auto_mirrored;
}
return activityId;
}
电池-原生有这样的配置,
android/frameworks/base/core/res/res/drawable/stat_sys_battery.xml
BatteryService
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:maxLevel="4" android:drawable="@android:drawable/stat_sys_battery_0" />
<item android:maxLevel="15" android:drawable="@android:drawable/stat_sys_battery_15" />
<item android:maxLevel="35" android:drawable="@android:drawable/stat_sys_battery_28" />
<item android:maxLevel="49" android:drawable="@android:drawable/stat_sys_battery_43" />
<item android:maxLevel="60" android:drawable="@android:drawable/stat_sys_battery_57" />
<item android:maxLevel="75" android:drawable="@android:drawable/stat_sys_battery_71" />
<item android:maxLevel="90" android:drawable="@android:drawable/stat_sys_battery_85" />
<item android:maxLevel="100" android:drawable="@android:drawable/stat_sys_battery_100" />
</level-list>
android 8.0 以上是通过 BatteryMeterView.java 绘制出来的
//如果图形较复杂可添加3套图片(1套平时状态 tint, 2套充电)
private int getIconLocked(boolean charging) {
if (charging) {
//默认颜色极为白色
if(mNonAdaptedForegroundColor == DarkIconDispatcher.DEFAULT_ICON_TINT){
return R.drawable.os_stat_sys_battery_charge_d;
}else{
//暗色模式
return R.drawable.os_stat_sys_battery_charge;
}
} else {
// 普通的模式
return R.drawable.os_stat_sys_battery;
}
}