背景:
前些天有vip学员朋友有问到关于小米等主流手机在分屏,自由窗口时候都发现有一个3个点的辅助按钮,但是原生aosp是没有这个按钮的,学员好奇这个辅助点按钮的功能和实现原理。
下面先截图展示一下相关的辅助点的功能
分屏下辅助点展示位置:

自由窗口模式下辅助点展示位置:

那么下面本文就针对这个功能对小米手机进行功能和实现方案的调研,方便各位vip学员朋友也可以给自己公司的分屏也做出这个功能。
3个辅助点按钮功能及意义
在分屏或自由窗口点击2个辅助点按钮后出现如下窗口画面:

下面针对这个窗口这些按钮分别进行功能的详细说明:
1、选中当前task所处于的状态
比如上图中蓝色选中的状态就是当前Task状态,当前就是分屏模式的下分屏,其他没有选中的状态是可以进行点击切换的。
2、进入全屏按钮

点击这个按钮就可以让当前的Task变成全屏状态FullScreen
3、进入分屏状态
分屏也是有上分屏和下分屏位置区别之分,所以上下分屏位置变化也是可以通过这个按钮,不过这里主要还是提供给其他Task模式要到分屏模式使用的,比如自由窗口进入分屏。
4、进入自由窗口状态

这个按钮功能是把当前task从其他状态进入到自由窗口状态,比如分屏模式切换到自由窗口模式既可以点击这个按钮。
5、新建一个Task进入自由窗口状态
这个按钮就是新添加一个Task进入自由窗口状态,注意这里新添加一个Task,而不是让原来Task变化模式到自由窗口。
5、退出当前Task
点击这个x按钮,代表当前Task要退出,比如退出分屏,退出自由窗口。
3个辅助点按钮功能总结:
主要是提供对当前Task的的一些模式变换的快捷操作方式,切换的Task模式不需要像以前一样需要先退出当前模式,再重新进入最近任务再进入另一个模式,现在分屏和自由窗口之间的切换都只需要通过这个快捷窗口就可以。
调研小米的分屏自由窗口三个点实现方案:
针对这个出现3个辅助点的画面进行dumpsys SurfaceFlinger,然后进行查看对应的图层。
dumpsys SurfaceFlinger > ~/1.txt

3个辅助点按钮调研
先看看3个辅助点按钮的图层名字:
再看看它的SurfaceFlinger中的层级结构树:
层级结构树中可以看出的Miui Caption of Task这个图层其实是挂在了自己的父Task=1037图层下,所以就可以看到上下分屏都有这三个点的按钮。
操作Task模式Menu窗口调研

menu窗口实现原理剖析:
先看看图层名字
可以看出这个时候menu窗口名字和原来3个辅助点按钮图层是不一样的,这里名字是Caption Menu of Task=1040下面挂载真正内容显示的图层Additional window of Task=1040。
对应的层级结构精简后的树结构
│ │ │ │ │ ├─ Task=3#74
│ │ │ │ │ │ ├─ SoScBlurController#85
│ │ │ │ │ │ ├─ Task=5#76
│ │ │ │ │ │ ├─ Task=4#75
│ │ │ │ │ ├─ Caption Menu of Task=1040#50133
│ │ │ │ │ │ └─ Additional window of Task=1040Leash#50134
│ │ │ │ │ │ └─ Additional window of Task=1040#50135
对于menu画面窗口得出一下结论:
对于 Caption Menu 其实本质上是挂载在分屏的总Task=3下面,并没有挂载在某一个分屏的Task下面,说明上下分屏情况下一般只能有一个Task是可以显示Caption Menu of Task的对应画面,只有一份只是位置进行了变化而已。
但是无论menu还Miui Caption的图层,进行dumpsys window windows后,发现都没有Miui Caption 和Caption Menu的相关信息

这里就说明其实实现原理依然是使用原生分屏,自由窗口中大量使用的Windowless方案进行实现。Windowless的实现部分在马哥分屏,三分屏课程中已经进行大量实战讲解,这里就不在重复讲述了。
核心难点提示:
1、配置好各个Windowless窗口的创建和控制
2、针对menu窗口中各个按钮点击后触发的Task模式变换是最核心的业务部分
3、每个Task切换到下一个模式的前后状态和画面的过渡
原文参考地址:
https://mp.weixin.qq.com/s/HtF__xgsDTUTk7OndOhwKQ
更多framework实战开发干货,及讨论framework系统开发干货,请关注下面“千里马学框架”
211

被折叠的 条评论
为什么被折叠?



