1、导航栏图标的布局文件位置 frameworks/base/packages/SystemUI/res/values-sw600dp/config.xml中搜素config_navBarLayout
2、导航栏布局文件同时为了适应不同大小的显示屏,同时还有其他的布局文件,位置分别是
frameworks/base/packages/SystemUI/res/values/config.xml中搜索config_navBarLayout
frameworks/base/packages/SystemUI/res/values-sw372dp/config.xml中搜config_navBarLayout
frameworks/base/packages/SystemUI/res/values-sw400dp/config.xml中搜config_navBarLayout
frameworks/base/packages/SystemUI/res/values-sw900dp/config.xml中搜config_navBarLayout
3、增加相关字符,在frameworks/base/packages/SystemUI/res/values/strings.xml最后增加
<!-- Content description of the power button for accessibility (not shown on the screen). [CHAR LIMIT=NONE] -->
<string name="accessibility_power">Power</string>
4、增加按键的layout,选择在frameworks/base/packages/SystemUI/res/layout下新建一个power.xml文件
<?xml version="1.0" encoding="utf-8"?>
<com.android.systemui.navigationbar.buttons.KeyButtonView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:id="@+id/power"
android:layout_width="@dimen/navigation_key_width"
android:layout_height="match_parent"
android:layout_weight="0"
systemui:keyCode="0"
android:scaleType="center"
android:contentDescription="@string/accessibility_power"
android:paddingStart="@dimen/navigation_key_padding"
android:paddingEnd="@dimen/navigation_key_padding"
/>
其中, keyCode是按键值, 若不想处理为按键, 则置为0
5、 在frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java新增如下
public static final String POWER = "power";
NavigationBarInflaterView.java里 View createView(String buttonSpec, ViewGroup parent, LayoutInflater inflater)下新增如下
else if(POWER.equals(button)){
v = inflater.inflate(R.layout.power, parent, false);
}
6、在frameworks/base/packages/SystemUI/res/values-sw600dp/config.xml中搜素config_navBarLayout中增加power
7、在frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java的private void prepareNavigationBarView()新增如下
//添加点击监听并是按钮可见
ButtonDispatcher powerButton=mNavigationBarView.getPowerButton();
powerButton.setOnClickListener(mPowerClickListener);
//powerButton.setOnTouchListener(mPowerTouchListener);
powerButton.setVisibility(View.VISIBLE);
NavigationBar.java里新增如下
//点击事件
private View.OnClickListener mPowerClickListener = new View.OnClickListener(){
public void onClick(View v){
Intent intent = new Intent("android.intent.action.POWER_MENU");
mContext.sendBroadcast(intent);
}
};
8、 在frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java下新增如下
private KeyButtonDrawable mPowerIcon;
NavigationBarView.java里public NavigationBarView(Context context, AttributeSet attrs)下新增如下
//添加到集合
mButtonDispatchers.put(R.id.power, new ButtonDispatcher(R.id.power));
NavigationBarView.java里新增如下
//外部调用使用
public ButtonDispatcher getPowerButton() {
return mButtonDispatchers.get(R.id.power);
}
NavigationBarView.java里private void updateIcons(Configuration oldConfig)下新增如下
//虚拟按钮图标样式
mPowerIcon = getDrawable(R.drawable.ic_settings_power);
NavigationBarView.java里 public void updateNavButtonIcons()下新增如下
getPowerButton().setImageDrawable(mPowerIcon);
9、在frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java中public void init(Context context, IWindowManager windowManager,WindowManagerFuncs windowManagerFuncs)下新增如下
//设置广播监听事件
IntentFilter ifPower = new IntentFilter("android.intent.action.POWER_MENU");
context.registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
//show global actions dialog
showGlobalActionsInternal();
}
}, ifPower);
10、修改完成之后保存编译