Android源码开发之修改Launcher & SystemUI

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、修改状态栏高度:

在路径packages\apps\Launcher3\res\values下的dimens.xml文件中:
修改属性:
<dimen name="dynamic_grid_search_bar_height">18dp</dimen>   <!--Frank修改, 搜索框高度 48dp → 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文件中
<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.java文件中的showFirstRunWorkspaceCling()方法中添加一个设置默认壁纸的方法setDefaultWallPaper();
方法具体实现如下:
/**
 * 设置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();
    }
}

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值