Android源码开发之修改Launcher & SystemUI

1、状态栏添加虚拟按键:

直接在navigation_bar.xml中找到三个虚拟按键的代码,复制到status_bar.xml中所需要放置的位置:

            
            

            

            
            

            

            
            
            


其中返回键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中的

name="config_showNavigationBar">false

修改当前设备源码路径(当前设备是astar-ococci)android\device\softwinner\astar-ococci\overlay\frameworks\base\core\res\res\values\config.xml中的

name="config_showNavigationBar">false   
以及android\device\softwinner\astar-y3\overlay\frameworks\base\core\res\res\values\config.xml中的

name="config_showNavigationBar">false   
综上所述,综合方案一和方案二,能有效的使NavigationBar永久隐藏,并且不占用任何屏幕空间,任何点击操作都不会唤醒navigationBar重新出现。完美解决!


3、修改状态栏高度:

在路径packages\apps\Launcher3\res\values下的dimens.xml文件中:
修改属性:
name="dynamic_grid_search_bar_height">18dp   


4、显示app title:

(1).显示title
在路径packages\apps\Launcher3\src\com\android\launcher3下的BubbleTextView.java文件中:
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高度
修改DynamicGrid.java文件中的
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从右侧改到底部:

(1).修改config.xml文件中
name="hotseat_transpose_layout_with_orientation">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.java文件中的showFirstRunWorkspaceCling()方法中添加一个设置默认壁纸的方法setDefaultWallPaper();
方法具体实现如下:
/**
 * 设置launcher默认壁纸
 * 

* 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(); } }


你可能感兴趣的:(Android源码开发)