【安卓13】谷歌原生桌面launcher3源码修改,修改桌面布局(首屏应用、小部件、导航栏、大屏设备任务栏)

前言

近期接到一个关于谷歌EDLA认证的需求,我负责的是谷歌原生桌面布局的修改,通过研究源码,将涉及到了一些修改思路发出来,大家可以参考一下有没有对你有用的信息。主要修改内容有:

1、搜索栏、底部导航栏未居中
2、中部应用未按要求排布,详情请参考摹客
3、在原生Google桌面未添加中性S-write和投屏Kshare、欢迎页应用

现状图:

参考图:

一、谷歌搜索框的修改

涉及修改的地方有:

1、Launcher3\res\xml\device_profiles.xml

2、com/android/launcher3/Workspace.java

1、首先观察device_profiles.xml代码,一般大屏(平板)设备会加载6*5的布局,手机设备会加载手机的布局,该文件里定义了4个不同的布局类型,如何确定设备加载哪个布局呢?你可以在桌面长按应用图标,然后观察可以移动多少个格子,然后根据行列数找到要修改的布局位置。比如我设备是加载6 * 5布局,我修改这里**launcher:numSearchContainerColumns=“5”**修改谷歌搜索框占据5个格子(横屏总共7个格子)

<--这个行数可以根据自己想要的效果修改,比如我就改了7*6布局,6行7列--/>	
	<grid-option
        launcher:name="6_by_5"
        launcher:numRows="6" 
        launcher:numColumns="7"
        launcher:numSearchContainerColumns="5"
        launcher:numFolderRows="3"
        launcher:numFolderColumns="4"
        launcher:numHotseatIcons="0"
        launcher:hotseatColumnSpanLandscape="2"
        launcher:numAllAppsColumns="6"
        launcher:isScalable="true"
        launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_6_5"
        launcher:devicePaddingId="@xml/paddings_6x5"
        launcher:dbFile="launcher_6_by_5.db"
        launcher:defaultLayoutId="@xml/default_workspace_6x5"
        launcher:deviceCategory="tablet" >

        <display-option
            launcher:name="Tablet"
            launcher:minWidthDps="900"
            launcher:minHeightDps="820"
            launcher:minCellHeight="120"
            launcher:minCellWidth="102"
            launcher:minCellHeightLandscape="104"
            launcher:minCellWidthLandscape="120"
            launcher:iconImageSize="60"
            launcher:iconTextSize="14"
            launcher:borderSpaceHorizontal="16"
            launcher:borderSpaceVertical="64"
            launcher:borderSpaceLandscapeHorizontal="64"
            launcher:borderSpaceLandscapeVertical="16"
            launcher:horizontalMargin="54"
            launcher:horizontalMarginLandscape="120"
            launcher:allAppsCellWidth="96"
            launcher:allAppsCellHeight="142"
            launcher:allAppsCellWidthLandscape="126"
            launcher:allAppsCellHeightLandscape="126"
            launcher:allAppsIconSize="60"
            launcher:allAppsIconTextSize="14"
            launcher:allAppsBorderSpaceHorizontal="8"
            launcher:allAppsBorderSpaceVertical="16"
            launcher:allAppsBorderSpaceLandscape="16"
            launcher:hotseatBarBottomSpace="30"
            launcher:hotseatBarBottomSpaceLandscape="40"
            launcher:canBeDefault="true" />

    </grid-option>

</profiles>

2、谷歌搜索框的位置在workspace.java里面修改,在该类里面查找这个方法:bindAndInitFirstWorkspaceScreen,定位到这里

    public void bindAndInitFirstWorkspaceScreen() {
        if (!FeatureFlags.QSB_ON_FIRST_SCREEN) {
            return;
        }

        // Add the first page
        CellLayout firstPage = insertNewWorkspaceScreen(Workspace.FIRST_SCREEN_ID, getChildCount());
        // Always add a first page pinned widget on the first screen.
        if (mFirstPagePinnedItem == null) {
            // In transposed layout, we add the first page pinned widget in the Grid.
            // As workspace does not touch the edges, we do not need a full
            // width first page pinned widget.
            mFirstPagePinnedItem = LayoutInflater.from(getContext())
                    .inflate(R.layout.search_container_workspace, firstPage, false);
        }

        int cellHSpan = mLauncher.getDeviceProfile().inv.numSearchContainerColumns;
        //格子数从0开始算,这里表示搜索框位置从X轴第2格子,y轴第3个格子算起,x轴占据5(cellHSpan)个格子,y轴占据1个格子
        CellLayoutLayoutParams lp = new CellLayoutLayoutParams(1, 2, cellHSpan, 1, FIRST_SCREEN_ID);
        lp.canReorder = false;
        if (!firstPage.addViewToCellLayout(
                mFirstPagePinnedItem, 0, R.id.search_container_workspace, lp, true)) {
            Log.e(TAG, "Failed to add to item at (0, 0) to CellLayout");
            mFirstPagePinnedItem = null;
        }
    }

提示:如果一开始桌面没有谷歌搜索框,可以使用微件的形式添加,添加微件这里又分为两种情况,具体使用哪种方式得看系统有没有去读取配置文件,没有的话就使用第一种,一种是直接在布局文件里面添加,比如res/xml/default_workspace_6x5.xml里面添加:

<appwidget
    container="-100"
    screen="0"
    x="1"
    y="2"
    spanX="5"
    spanY="1"
    packageName="com.google.android.googlequicksearchbox"
    className="com.google.android.googlequicksearchbox.SearchWidgetProvider"/>

另外一种方式是在google_gms包下的配置文件里面添加:release\vendor\partner_gms\apps\GmsSampleIntegration\res_dhs_full\xml\partner_default_layout.xml,例如

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2017 Google Inc. All Rights Reserved. -->
<favorites>
  <!-- Hotseat (We use the screen as the position of the item in the hotseat) -->
  <!-- Dialer Messaging Calendar Contacts Camera -->
  <!--<favorite container="-101" screen="0" x="0" y="0" packageName="com.google.android.dialer" className="com.google.android.dialer.extensions.GoogleDialtactsActivity"/>-->
  <!--<favorite container="-101" screen="1" x="1" y="0" packageName="com.google.android.apps.messaging" className="com.google.android.apps.messaging.ui.ConversationListActivity"/>-->
  <!-- <favorite container="-101" screen="0" x="0" y="0" packageName="com.android.settings" className="com.android.settings.Settings"/> -->
  <!-- <favorite container="-101" screen="1" x="1" y="0" packageName="com.android.deskclock" className="com.android.deskclock.DeskClock"/> -->
  <!-- <favorite container="-101" screen="2" x="2" y="0" packageName="com.google.android.calendar" className="com.android.calendar.event.LaunchInfoActivity"/> -->
  <!-- <favorite container="-101" screen="3" x="3" y="0" packageName="com.google.android.contacts" className="com.android.contacts.activities.PeopleActivity"/> -->
  <!-- <favorite container="-101" screen="4" x="4" y="0" packageName="com.android.camera2" className="com.android.camera.CameraLauncher"/> -->
  <!-- In Launcher3, workspaces extend infinitely to the right, incrementing from zero -->
  <!-- Google folder -->
  <!-- Google, Chrome, Gmail, Maps, YouTube, (Drive), (Music), (Movies), Duo, Photos -->
  <folder title="@string/google_folder_title" screen="0" x="1" y="3">
    <favorite packageName="com.google.android.googlequicksearchbox" className="com.google.android.googlequicksearchbox.SearchActivity"/>
    <favorite packageName="com.android.chrome" className="com.google.android.apps.chrome.Main"/>
    <favorite packageName="com.google.android.gm" className="com.google.android.gm.ConversationListActivityGmail"/>
    <favorite packageName="com.google.android.apps.maps" className="com.google.android.maps.MapsActivity"/>
    <favorite packageName="com.google.android.youtube" className="com.google.android.youtube.app.honeycomb.Shell$HomeActivity"/>
    <favorite packageName="com.google.android.apps.docs" className="com.google.android.apps.docs.app.NewMainProxyActivity"/>
    <favorite packageName="com.google.android.apps.youtube.music" className="com.google.android.apps.youtube.music.activities.MusicActivity"/>
    <favorite packageName="com.google.android.videos" className="com.google.android.videos.GoogleTvEntryPoint"/>
    <favorite packageName="com.google.android.apps.tachyon" className="com.google.android.apps.tachyon.MainActivity"/>
    <favorite packageName="com.google.android.apps.photos" className="com.google.android.apps.photos.home.HomeActivity"/>
  </folder>
  <favorite screen="0" x="5" y="3" packageName="com.android.vending" className="com.android.vending.AssetBrowserActivity"/>
  
  <appwidget screen="0" x="2" y="0" packageName="com.android.deskclock" className="com.android.alarmclock.DigitalAppWidgetProvider" spanX="3" spanY="2" />
  <appwidget screen="0" x="1" y="2" packageName="com.google.android.googlequicksearchbox" className="com.google.android.googlequicksearchbox.SearchWidgetProvider" spanX="5" spanY="1" />
</favorites>

注释掉的内容是定义桌面的hotSeat显示的应用,其中,添加小部件使用的是appwidget标签,桌面时钟就可以这样添加,folder标签定义的是一个桌面文件夹,里面可以定义文件夹要存放的应用。

二、首屏应用位置修改

和谷歌搜索框一样,也是在device_profiles.xml文件里面定义桌面的行列数,然后根据系统是否会读取partner_default_layout.xml布局文件来决定修改的位置;(1)如果读取,则在partner_default_layout.xml里面定义应用的包名和类型以及位置信息例如<favorite screen="0" x="5" y="3" packageName="com.android.vending" className="com.android.vending.AssetBrowserActivity"/>表示在screen=“0”(第一屏)的第6列格子,第4行格子添加谷歌商店app。(2)如果不读取partner_default_layout.xml布局文件,则在对应的X×X.xml里面修改应用的位置。

三、底部任务栏和导航栏修改

1、如果设置了hotSeat应用在底部,即在partner_default_layout.xml定义的container="-101"的标签(文件里被注释掉的部分代码),那么在桌面是显示的是底部固定的应用,不会展示最近任务栏,如果屏蔽掉了hotSeat固定的应用,则默认显示最近任务栏去替换掉固定的应用,最近任务栏显示图标的数量与device_profiles.xml文件里的launcher:numHotseatIcons="0"属性有关,这里我设置numHotSeatIcon=0表示不显示最近任务栏,如果你想去掉任务栏,可以使用这种方式,有其他博客去掉任务栏的方法是将isTablet的属性设置为false,意思是将设备设置为手机屏幕,手机屏幕不显示最近任务栏,导航栏也会默认居中,我试过该方法在大屏设备上行不通,达不到想要的效果,大家可以去看看他写的:大屏设备导航栏居右

2、如果使用我的方法,即将hotSeat显示的图标数量设置为0:launcher:numHotseatIcons="0"
如果直接编译,运行时会发生运行时异常,通过抓log发现,在源码中有多处地方在计算布局的时候,都会去除以numHotseatIcons,而我们知道,除数不能为0,所以报错桌面闪退。这个时候,我们需要将引发异常的地方修改一下(注意numHotseatIcons设置为1和0都会引发异常,因为有个地方对numHotseatIcons做了-1操作),修改位置如下:
com/android/launcher3/DeviceProfile.java
在这类里面按ctrl+F查找numShownHotseatIcons,将涉及到numShownHotseatIcons的计算都做一层判断,如果为0,则换一种算法

也可以先在device_profiles.xml里面全局查找追踪numHotseatIcons这个变量,一步步追踪到DeviceProfile.java这个类,这样会对整个流程更清楚

这里是我修改的具体位置,截图有行号,给大家参考:

注意到这个方法,里面也用到了

修改这两个计算方法

修改到这里,我们已经把最近任务栏去掉啦!!

四、接下来就是要把导航栏居中

首先我们观察device_profiles.xml文件,注意到有这个变量

查找这个变量,追踪代码发现,这个变量控制着底部导航栏距离右边框的dp值,数值越大,越往中间靠拢,有了这个思路,让导航栏居中也就不难实现了,首先我们知道,导航栏居右是因为系统判断为大屏设备tablet,我们既然要保留tablet这个属性,就不能通过改变设备为手机模式来控制导航栏居中,所以就可以控制右边距啦!

而改变这个值很简单,只需要改变引用的资源值即可

我们进入该文件,改变右边距

这个值大家可以慢慢调试,我这里是居中了。

五、总结

写个总结:首先判断系统是否加载partner_gms里面的布局文件,再修改布局代码,这个源码我研究了一周多,网上关于安卓13的launcher3资料不全,最终还是得自己研究源码追踪代码,期间编译调试了几十次吧!!
最终效果

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
安卓源码android web应用Dialog对话框OCR图像识别listview相关EditText输入框Launcher 桌面45个合集: [四次元]Android Launcher 桌面分页滑动代码.rar [四次元]Android Launcher 源码修改可编译.rar [四次元]android 自定义对话框.rar [四次元]android-styled-dialogs 可自定义样式的dialog.zip [四次元]Android中实现Iphone样式的AlertDialog.zip [四次元]Android实现Windows风格的Dialog.zip [四次元]dlna库源代码包.zip [四次元]gridview分页效果.zip [四次元]HerilyAlertDialog完全自定义的Dialog.zip [四次元]HorizontalListViewDemo 横向滑动的ListView.zip [四次元]HorizontalListView仿微信发起群聊.zip [四次元]jqmMobileDemo-master.zip [四次元]jqmMobileDemo1_1-master.zip [四次元]listview 的各种动画效果.rar [四次元]listview 适配器 优化 重用.rar [四次元]ListView+CheckBox UI 完美版。实现 全选 、 全不选 、 删除等功能.rar [四次元]ListView停止滚动开启下载图片.zip [四次元]Listview分页加载数据.rar [四次元]ListView多级展示,item由对象Leaf提供数据,可设置多个控件.zip [四次元]listview实现图片的异步加载.rar [四次元]listview快速滑动,修改默认的滑动条.rar [四次元]ListView滚动气泡提示.rar [四次元]listview获取网络图片缓存优化.zip [四次元]Location1014.rar [四次元]map_baidu.zip [四次元]MyNFCDemon.rar [四次元]OAuth认证以及使用网易微博开放平台实现聊天功能.rar [四次元]一个ExpandableListView的例子,实现多级菜单分类展示.rar [四次元]仿QQ消息列表(ListView)滑动删除效果源码.rar [四次元]仿QQ的头像选择弹出的对话框,酷似!.zip [四次元]前面部分可以编辑后面部分不可编辑的EditText.zip [四次元]动态添加RadioGroup的RadioButton.zip [四次元]单排显示gridview并从解析JSON读取数据加载项目.zip [四次元]双列关联listview.rar [四次元]基于JBox2D的Android游戏开发全源码.zip [四次元]安卓桌面应用EyeRoom.zip [四次元]实现列表多选的DEMO.zip [四次元]带有拼音首字母排序的listview.rar [四次元]带有进度条的button.rar [四次元]最全的OCR图像识别技术源码内有说明.zip [四次元]横向ListView的完整实现(包含基于横向listview做的一个小相册demo).rar [四次元]横竖都能滑动的 listview 嵌套在一起的.zip [四次元]自定义单选、多选对话框及popwindow窗口实例源码.rar [四次元]自定义彩色Toast.rar [四次元]自定义组件实现可滑动的ToggleButton的功能..rar
### 回答1: 安卓智能电视及机顶盒的桌面launcher应用源码是指开发智能电视和机顶盒的主屏界面的代码。这个应用通常包括主屏界面、应用程序快捷方式、菜单栏、壁纸、小部件等功能。 主屏界面是用户首次进入智能电视和机顶盒系统时所见的界面,它展示了各种应用程序的图标和其他信息。应用程序快捷方式用于提供对常用应用程序的快速访问。 菜单栏一般位于屏幕的底部或者侧边,提供了切换不同功能区域的选项,比如影片、电视剧、游戏、设置等。 壁纸是用于装饰主屏界面的背景图片,可以根据用户的喜好进行设置。 小部件是主屏界面上用来显示实时信息的功能模块,比如天气、时钟、日历等。 源码可以通过开源社区或者开发者论坛获取,比如GitHub等。一般的源码会涉及到界面布局应用程序图标的显示与点击、菜单栏的切换、壁纸的设置与更换、小部件的添加和管理等功能的实现。 通过分析源码,开发者可以了解到如何搭建和设计智能电视和机顶盒的主屏界面,如何实现快捷方式、菜单栏、壁纸、小部件等功能。 需要注意的是,源码仅提供了一种开发框架和示例,开发者还需要根据自己的需求和设计理念进行二次开发和优化。源码只是一个起点,在实际开发中还需要考虑用户体验和性能优化等方面的问题。 ### 回答2: 对于安卓智能电视和机顶盒的桌面launcher应用源码,目前市面上有许多开源项目可供参考和使用。 其中,一款广泛使用的开源桌面launcher应用是"Leanback Launcher"。该应用是Google官方为安卓电视开发的一个桌面launcher应用,其功能强大、稳定可靠,并在市场上得到了广泛应用。Leanback Launcher的源码可以在GitHub上找到,让开发者可以自由地查看和修改源代码。 此外,还有一些其他的开源桌面launcher应用值得关注,例如"ATV Launcher"和"Android TV Launcher"。它们都是为安卓电视和机顶盒设计的桌面launcher应用,提供了简洁的用户界面、可自定义的主屏幕和应用快捷方式等功能。 除了这些开源桌面launcher应用,一些知名的电视和机顶盒品牌也会提供自己的桌面launcher应用源码。例如,小米的"MiTV Launcher"和华为的"华为智能电视应用商店"等,它们都有对应的开发者平台和开发者文档,开发者可以通过申请访问这些平台,获得相应的源码和开发工具。 最后,还可以参考一些专业的开发者社区和论坛,如XDA Developers、CSDN、安卓论坛等,这些平台上会有开发者分享的桌面launcher应用源码和相关教程,可以提供一些有用的资源和指导。 总之,对于安卓智能电视和机顶盒的桌面launcher应用源码,开发者可以通过搜索开源项目、品牌提供的源码、开发者社区等途径获取相关资源,并进行参考和学习,以开发出适配电视和机顶盒的优秀的桌面launcher应用。 ### 回答3: 安卓智能电视及机顶盒的桌面launcher应用源码是指用于定制和开发智能电视和机顶盒的用户界面的代码。该源码包含了桌面布局、图标、快捷方式、背景主题、焦点导航等相关功能的实现。 安卓智能电视和机顶盒的桌面launcher应用源码主要由以下几个部分组成: 1. 桌面布局桌面布局是指桌面图标、快捷方式、小部件等在屏幕上的摆放方式。源码中包含了桌面布局的相关逻辑和算法,可以自定义调整图标和小部件的位置和大小。 2. 图标和快捷方式:图标和快捷方式是桌面的核心元素,通过源码可以实现对图标和快捷方式的添加、删除、移动和定制。 3. 背景主题:背景主题可以改变桌面的外观和风格,源码中包含了管理背景主题的逻辑和实现。 4. 焦点导航:焦点导航是指通过遥控器或遥控器键盘控制桌面上的元素,源码中包含了焦点导航相关的逻辑和实现。 通过使用源码,开发人员可以根据自己的需求定制和优化智能电视和机顶盒的桌面launcher应用。他们可以修改布局、添加新功能、改变外观和主题,以提供更好的用户体验。同时,源码还提供了对接其他应用和服务的接口,使得开发人员可以将桌面launcher与其他应用、游戏和内容进行集成,以增强用户的功能和娱乐体验。 总之,安卓智能电视和机顶盒的桌面launcher应用源码是开发人员用于定制和开发智能电视和机顶盒用户界面的重要资源,通过使用源码可以实现对桌面布局、图标和快捷方式、背景主题、焦点导航等方面的自定义,并与其他应用和服务进行集成,提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值