上一篇文章(AOSP6.0.1 launcher3入门篇—解析launcher.java文件)描述了launcher3的加载过程,本篇文章记录hotseat停靠方向和位置、隐藏页指示器、Folder大小等。

首先介绍构造函数

找到public DeviceProfile(Context context, InvariantDeviceProfile inv,Point minSize, Point maxSize,int width, int height, boolean isLandscape)
this.inv = inv;传入InvariantDeviceProfile实例对象,InvariantDeviceProfile类负责hotseat的停靠方向,allapps按键进入cellLayout的布局设置,包括指定设备型号的app摆放形式(行、列设置)和icon大小,在文章最后对InvariantDeviceProfile类进行分析this.isLandscape = isLandscape;
如果传入的是true桌面为横屏,false桌面为竖屏isTablet = res.getBoolean(R.bool.is_tablet);
isLargeTablet = res.getBoolean(R.bool.is_large_tablet);
这里调用的packages/apps/Launcher3/res/values/config.xml ,tablet和large_tablet默认为falsetransposeLayoutWithOrientation =res.getBoolean(R.bool.hotseat_transpose_layout_with_orientation);
这里也是调用config.xml,<bool name="hotseat_transpose_layout_with_orientation">true</bool>
允许hotseat设置停靠方向和停靠位置(比如放置在屏幕正中心位置),如果为false在横屏模式下无效edgeMarginPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_edge_margin);desiredWorkspaceLeftRightMarginPx = 2 * edgeMarginPx;pageIndicatorHeightPx =res.getDimensionPixelSize(R.dimen.dynamic_grid_page_indicator_height);defaultPageSpacingPx =res.getDimensionPixelSize(R.dimen.dynamic_grid_workspace_page_spacing);overviewModeMinIconZoneHeightPx =res.getDimensionPixelSize(R.dimen.dynamic_grid_overview_min_icon_zone_height);overviewModeMaxIconZoneHeightPx =res.getDimensionPixelSize(R.dimen.dynamic_grid_overview_max_icon_zone_height);overviewModeBarItemWidthPx =res.getDimensionPixelSize(R.dimen.dynamic_grid_overview_bar_item_width);overviewModeBarSpacerWidthPx =res.getDimensionPixelSize(R.dimen.dynamic_grid_overview_bar_spacer_width);overviewModeIconZoneRatio =res.getInteger(R.integer.config_dynamic_grid_overview_icon_zone_percentage) / 100f;iconDrawablePaddingOriginalPx =res.getDimensionPixelSize(R.dimen.dynamic_grid_icon_drawable_padding);这里调用的packages/apps/Launcher3/res/values/dimens.xmlif (isLandscape) {availableWidthPx = maxSize.x;availableHeightPx = minSize.y;如果是横屏模式,采用x轴最大值,y轴最小值(比如比例为800*600)} else {availableWidthPx = minSize.x;availableHeightPx = maxSize.y;如果是竖屏模式,采用x轴最小值,y轴最大值(比如比例为600*800)}

private void updateAvailableDimensions(DisplayMetrics dm, Resources res)函数

float scale = 1f;
默认比例
int drawablePadding = iconDrawablePaddingOriginalPx;
当folder展开时,folder的高度为iconSizePx + drawablePadding + fm上限得到folder的实际高度updateIconSize(1f, drawablePadding, res, dm);
按实际比例计算出文件夹范围、hotseat范围Rect workspacePadding = getWorkspacePadding(false /* isLayoutRtl */);返回workspace空间,workspace是PageView类型,PageView大小可以在public void layout(Launcher launcher)中设置

private void updateIconSize(float scale, int drawablePadding, Resources res,
DisplayMetrics dm)函数

hotseatBarHeightPx = iconSizePx + 4 * edgeMarginPx;
不修改xml的情况下,修改hotseatBarHeightPx值可以改变Hotseat空间大小,达到
Hotseat放置屏幕中间位置效果hotseatBarHeightPx = (availableWidthPx  + iconSizePx + 6 * edgeMarginPx);
这个是修改后,hotseat空间范围变大,看起来像放置到屏幕中间,按钮触发事件的范围也会变大

private void computeAllAppsButtonSize(Context context)函数

float padding = res.getInteger(R.integer.config_allAppsButtonPaddingPercent) / 100f;
修改hotseat空间内所有app(不包括allapps按钮进入的CellLayout内app)的占用比例
xml文件所在位置/res/values/config.xml

public void layout(Launcher launcher)函数

PagedView workspace = (PagedView) launcher.findViewById(R.id.workspace);lp = (FrameLayout.LayoutParams) workspace.getLayoutParams();lp.gravity = Gravity.CENTER;Rect padding = getWorkspacePadding(isLayoutRtl);workspace.setLayoutParams(lp);workspace.setPadding(padding.left, padding.top, padding.right, padding.bottom);workspace.setPageSpacing(getWorkspacePageSpacing(isLayoutRtl));
这段是创建workspace的代码,xml位置在res/下,如果是竖屏调用layout-port/launcher.xml,
横屏调用layout-land/launcher.xml,修改xml可以实现主界面空白的效果<include layout="@layout/hotseat"android:id="@+id/hotseat"android:layout_width="match_parent"android:layout_height="match_parent"+       android:visibility="gone" />
在hotseat字段中增加“android:visibility="gone"”即可隐藏hotseat布局显示空白主界面方法:
hotseat字段增加“android:visibility="gone"”<com.android.launcher3.Workspaceandroid:id="@+id/workspace"android:layout_width="match_parent"android:layout_height="match_parent"-   launcher:pageIndicator="@+id/page_indicator"launcher:defaultScreen="@integer/config_workspaceDefaultScreen"></com.android.launcher3.Workspace>
workspace字段去掉“launcher:pageIndicator="@+id/page_indicator"”,不加载指示器<com.android.launcher3.FocusIndicatorViewandroid:id="@+id/focus_indicator"android:layout_width="0dp"android:layout_height="0dp" />
FocusIndicatorView字段宽和高改为0dp,在allapps进入的CellLayout布局中(二级桌面)长按app会显示FocusIndicatorView视图page_indicator字段增加“android:visibility="gone"”,不显示页指示器下面回到代码中:
如果想在空白桌面中显示所有app是可以实现的,只是目前使用的方式不太正确,按返回键会显示出hotseat布局从// Layout the hotseat/*View hotseat = launcher.findViewById(R.id.hotseat);
开始注释一直到 }*/  // Layout the Overview Mode上面的最后一个括号增加下面一段代码
View allapps = launcher.findViewById(R.id.apps_view);lp = (FrameLayout.LayoutParams) allapps.getLayoutParams();lp.gravity = Gravity.CENTER;allapps.setLayoutParams(lp);allapps.setPadding(padding.left, padding.top, padding.right, padding.bottom);
启动手机系统后即可看到allapps进入的CellLayout布局和app,这种方式不太好,继续探索新的方式...

下面说下hotseat停靠方向的修改
      进入InvariantDeviceProfile.java文件:

进入InvariantDeviceProfile(Context context)函数:
找到portraitProfile = new DeviceProfile(context, this, smallestSize,largestSize,largeSide , smallSide, /*false*/false /* isLandscape */);修改false为true,参考下面portraitProfile = new DeviceProfile(context, this, smallestSize,largestSize,largeSide , smallSide,true );这是竖屏模式下,hotseat布局右方停靠方式landscapeProfile = new DeviceProfile(context, this, smallestSize,largestSize,largeSide, smallSide, false);
横屏模式下,true改为false

AOSP6.0.1 launcher3入门篇-解析DeviceProject.java及相关文件相关推荐

  1. AOSP6.0.1 launcher3入门篇—解析launcher.java文件

    安卓系统是市场占用率最高.用户使用率最多的手机系统.大部分安卓手机厂商在AOSP(Android Open Source Project)的基础上进行二次开发,定制符合自家设备使用的安卓系统.本篇文章 ...

  2. AOSP6.0.1 launcher3入门篇—hotseat相关实现

    在安卓桌面程序的主界面我们可以看到是由QsbSearchBar(上方搜索框).Workspace(页视图空间).pageIndicator(页指示器).hotseat(底部视图空间)四个部分组成,它们 ...

  3. 《从零开始学习ASP.NET MVC 1.0》-开天辟地入门篇

    <从零开始学习ASP.NET MVC 1.0> 文章导航 (一) 开天辟地入门篇 (二) 识别URL的Routing组件 (三) Controller/Action 深入解析与应用实例 ( ...

  4. 明解C语言入门篇_第13章_文件处理

    前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...

  5. 微信小程序开发【从0到1~入门篇】

    目录 1. 微信小程序介绍 1.1 什么是小程序? 1.2  小程序可以干什么? 2. 申请账号 2.1 申请帐号 2.2 测试号申请(我们小程序账号申请完成之后,建议务必要申请一个测试号用来开发) ...

  6. 【E文件解析】Java实现E文件解析为对象

    参照一位大佬贡献的代码修改的(扩展了对象解析,修改了一些bug,比如流异常未关闭) E语言解析包_e文件-Java代码类资源-CSDN下载 封装好了,三行代码解析为对象 github:  https: ...

  7. AOSP6.0.1 系统中增加新的category类型与app绑定,并在hotseat容器中加载app

    在launcher3(桌面程序)的hotseat中,可以通过修改dw_phone_hotseat.xml在指定位置加载指定app(仅限于已经指定category类型为APP_xxxx的app或者是系统 ...

  8. Python实现《谁说菜鸟不会数据分析(入门篇)》的案例

    这段时间在学习Excel和Python相关内容,Excel数据分析入门有一本<谁说菜鸟不会数据分析(入门篇)>,内容细致,简洁易懂,注重培养分析的思维而不仅仅是告知方法.在学习Python ...

  9. 单目图像深度估计 - 入门篇

    由于公司网站设置,基于git的Blog越来越难打开,所以把部分内容搬运到这里. 一转眼都是两年前的内容了,且大部分都是我的个人理解,现在看来也难免有些Bug.虽然后来由于项目安排的关系没有继续单目图像 ...

最新文章

  1. 打造开发者的win7
  2. 认知学习法-学习笔记
  3. matlab 方波_matlab实现方波与三角波波形
  4. Axure教程 axure新手入门基础(2) 简单易上手
  5. linux加密框架 crypto 算法管理 - 动态和静态算法管理
  6. FastMM FastCode FastMove的使用
  7. 问题:'NoneType' object has no attribute 'encoding'
  8. JAVA实时运算_Java 实时运算簿页面
  9. 弱电工程综合布线施工过程控制
  10. 为何使用百度输入法老是出现错别字?
  11. 和菜鸟一起学android4.0.3源码之硬件gps简单移植
  12. 非常详细的范式讲解(1NF/2NF/3NF/BCNF)
  13. 教学设计-饭后百步走
  14. matlab三相电路基波图形,非正弦稳态对称三相电路如图a所示。A相电源电压为,其中基波角频率为ω1=1rad/s。负载参数为R=...
  15. Introduction to TurboFan
  16. 怎么卸载光速头条_教你怎么卸载光速浏览器
  17. 关于电影视频服务器架设的方法
  18. 徒步健步打卡活动,徒步过程拍照打卡,让徒步更有趣。box-sizing 属性允许我们在框的总宽度
  19. 关于前端方面的讨论帖
  20. 网络路由交换 -- 静态路由 和 缺省路由

热门文章

  1. Github中国区Star超过1W的大佬和他们的公众号,太强了!
  2. Linus:我们都老了,但Linux维护后继无人
  3. 什么鬼,面试官竟然让我用Redis实现一个消息队列!!?
  4. 微信支付软件架构重构之旅
  5. Mysql查询优化——中间表方法优化count()统计大数据量总数问题
  6. JEECG 3.2版本发布,基于代码生成器的智能开发平台
  7. Mac安装MATLAB 2017b
  8. 开源日志库Logger的使用秘籍
  9. 5.Servlet 对象(request-response)
  10. php转化IP为整形