1、状态栏添加虚拟按键:
直接在navigation_bar.xml中找到三个虚拟按键的代码,复制到status_bar.xml中所需要放置的位置:
<!--Frank,添加虚拟按键到状态栏,start-->
<!--android:src="@drawable/ic_sysbar_return_icon"-->
<com.android.systemui.statusbar.policy.KeyButtonView
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/accessibility_back"
android:scaleType="center"
android:src="@drawable/ic_sysbar_back"
systemui:glowBackground="@drawable/ic_sysbar_highlight"
systemui:keyCode="4"
/>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:visibility="invisible"
/>
<!--android:src="@drawable/ic_sysbar_home_icon"-->
<com.android.systemui.statusbar.policy.KeyButtonView
android:id="@+id/home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/accessibility_home"
android:src="@drawable/ic_sysbar_home"
systemui:glowBackground="@drawable/ic_sysbar_highlight"
systemui:keyCode="3"
systemui:keyRepeat="false"
/>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:visibility="invisible"
/>
<!--android:src="@drawable/ic_sysbar_recent_icon"-->
<com.android.systemui.statusbar.policy.KeyButtonView
android:id="@+id/recent_apps"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/accessibility_recent"
android:src="@drawable/ic_sysbar_recent"
systemui:glowBackground="@drawable/ic_sysbar_highlight"
/>
<!--Frank,添加虚拟按键到状态栏,end-->
其中返回键back和主页键home都有一个属性 systemui:keyCode="",这就相当于系统默认的具体功能实现,无需再在java代码中添加onClickListener点击事件就能完成点击操作,是不是非常方便! 但是recent_apps这个最近运行的应用却没有这么方便的代码,它没有默认的systemui:keyCode=""这个属性。于是只能在代码中想办法了 ↓
此时来到android\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\路径下的PhoneStatusBar.java
在prepareNavigationBarView()方法中添加一行代码就能搞定recent_apps这个键的具体功能:
//Frank修改, 状态栏添加虚拟按键并设置点击监听
mStatusBarView.findViewById(R.id.recent_apps).setOnClickListener(mRecentsClickListener);
因为点击事件mRecentsClickListener里面已经封装好了所执行的操作,所以直接找到recent_apps这个控件然后设置点击事件就行了。是不是也很简单呢!但当时改的时候可是费了不少功夫阅读源码呢!
2、隐藏导航栏:
方案一:
直接将android\frameworks\base\packages\SystemUI\res\layout\路径下的navigation_bar.xml中的控件给gone掉。
但会导致三个虚拟按键消失了,但是下面还有一块横向占满全屏的黑色区域无法消失并占用空间。于是有了方案二的出现 ↓
方案二:
修改android/framework/base/core/res/res/values/config.xml中的
<bool name="config_showNavigationBar">false</bool>
修改当前设备源码路径(当前设备是astar-ococci)android\device\softwinner\astar-ococci\overlay\frameworks\base\core\res\res\values\config.xml中的
<bool name="config_showNavigationBar">false</bool> <!--Frank修改, 隐藏导航栏 true → false-->以及android\device\softwinner\astar-y3\overlay\frameworks\base\core\res\res\values\config.xml中的
<bool name="config_showNavigationBar">false</bool> <!--Frank修改, 隐藏导航栏 true → false-->综上所述,综合方案一和方案二,能有效的使NavigationBar永久隐藏,并且不占用任何屏幕空间,任何点击操作都不会唤醒navigationBar重新出现。完美解决!
3、修改状态栏高度:
<dimen name="dynamic_grid_search_bar_height">18dp</dimen> <!--Frank修改, 搜索框高度 48dp → 18dp-->
4、显示app title:
public void setTextVisibility(boolean visible) { Resources res = getResources(); if (visible) { super.setTextColor(mTextColor); } else { // super.setTextColor(res.getColor(android.R.color.transparent)); super.setTextColor(mTextColor); //Frank, 将title显示出来,不再隐藏 } mIsTextVisible = visible; }(2).提升hotseat高度
hotseatBarHeightPx = iconSizePx + 4 * edgeMarginPx;
hotseatBarHeightPx = (int)((iconSizePx + 4 * edgeMarginPx) * 1.1); //Frank, 将整个hotseat的高度提高10%
hotseatCellHeightPx = iconSizePx;
替换成 ↓
hotseatCellHeightPx = hotseatBarHeightPx; //Frank修改, iconSizePx → hotseatBarHeightPx:将hotseat里的item的高度由原来的iconsize改成hotseat的高度。
5、水平状态时将HotSeat从右侧改到底部:
<bool name="hotseat_transpose_layout_with_orientation">false</bool> <!-- Frank修改, 横向hotseat改到底部: true → false-->(2).修改Hotseat.java文件中onFinishInflate()方法↓
if (grid.isLandscape && !grid.isLargeTablet()) { // mContent.setGridSize(1, (int) grid.numHotseatIcons); mContent.setGridSize((int) grid.numHotseatIcons, 1); //Frank,右侧横向排列5个图标 } else { mContent.setGridSize((int) grid.numHotseatIcons, 1); }
6、替换默认桌面壁纸:
/** * 设置launcher默认壁纸 * <p> * by Frank修改 */ private void setDefaultWallPaper() { //修改默认背景 OWL test,可以在Framework替换默认静态图default_wallpaper WallpaperManager mWallpaperManager = WallpaperManager.getInstance(this); try { mWallpaperManager.setResource(R.drawable.default_wallpaper); //此处default_wallpaper图片我已替换掉 } catch (IOException e) { Log.e("Frank", "set default wallpaper error"); e.printStackTrace(); } }