文章目录
- 背景:
- 自由窗口实现功能和技术原理剖析
- 小米自由窗口为啥比原生体验好?
- 自由窗口整体结构剖析
- 放大进入全屏的功能
- 退出自由窗口的相关交互方式
- 拖动自由窗口最右侧交互最小化功能
背景:
国内这些手机大厂在自由窗口这块的功能其实都做得比较好,也一直是一个相比aosp原生修改差异较大的功能,也属于一个非常大的亮点提升,代表厂商比如常见的小米,ov等。
小米自由窗口展示如下:而且国内这些手机厂商在自由窗口这块额外加入的功能还比较多,所以今天针对小米手机做一个关于自由窗口的调研报告,方便各位vip课程群里的学员朋友进行自由窗口开发时候有个比较好的参考,更多关于手机大厂自由窗口功能讨论可以联系马哥交流或者获取额外vip资料(如果有的话会分享相关学员)。
自由窗口实现功能和技术原理剖析
小米自由窗口为啥比原生体验好?
对比原生的自由窗口展示样子小米的自由窗口,样式上就好看很多
这块也是自由窗口最核心的优化部分,那么小米是怎么实现这个自由窗口的美化呢?
其实这块和马哥自由窗口课程中实战讲解的原理一样,具体可以通过dumpsys验证他的原理:
dumpsys activity containers
│ └─ DefaultTaskDisplayAreatype=undefinedmode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0]bounds=[0,0][1220,2712]│ ├─Task=6311type=standardmode=FREEFORM override-mode=FREEFORM requested-bounds=[183,295][1403,2247]bounds=[183,295][1403,2247]│ │ └─ ActivityRecord{242935665u0 com.android.mms/.ui.MmsTabActivity t6311}type=standardmode=FREEFORM override-mode=undefined requested-bounds=[0,0][0,0]bounds=[183,295][1403,2247]│ │ └─ ed49369 com.android.mms/com.android.mms.ui.MmsTabActivitytype=standardmode=FREEFORM override-mode=undefined requested-bounds=[0,0][0,0]bounds=[183,295][1403,2247]│ ├─Task=1type=HOMEmode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0]bounds=[0,0][1220,2712]│ │ └─Task=2type=HOMEmode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0]bounds=[0,0][1220,2712]│ │ └─ ActivityRecord{247813959u0 com.miui.home/.launcher.Launcher t2}type=HOMEmode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0]bounds=[0,0][1220,2712]│ │ ├─ 5db03ab LauncherOverlayWindow:com.miui.personalassistanttype=HOMEmode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0]bounds=[0,0][1220,2712]│ │ └─ 37aaaf2 com.miui.home/com.miui.home.launcher.Launchertype=HOMEmode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0]bounds=[0,0][1220,2712]可以看出com.android.mms/.ui.MmsTabActivity短信这个activity实际是mode=FREEFORM的情况。
但是bounds大小是:
requested-bounds=[183,295][1403,2247]bounds=[183,295][1403,2247]而且看看窗口大小的bounds:
Window#14 Window{ed49369 u0 com.android.mms/com.android.mms.ui.MmsTabActivity}://省略 Requestedw=1220h=1952mLayoutSeq=117692但是明显这窗口大小是大于自由窗口展示的,因为w=1220实际是全屏幕的宽度,所以这里其实有对图层进行缩放:
所以这块其实本质原理和课程一模一样。
自由窗口整体结构剖析
除了自由窗口窗口的本身Task图层外,小米还设计了上下Caption Bar
进行dumpsys sf后得出如下图层情况
Display4630946370515662722(active)HWC layers: --------------------------------------------------------------------------------------------------------------------------------------------------------------- Layer name Z|Window Type|Layer Class|Comp Type|Transform|Disp Frame(LTRB)|Source Crop(LTRB)|Frame Rate(Explicit)(Seamlessness)[Focused]--------------------------------------------------------------------------------------------------------------------------------------------------------------- Wallpaper BBQ wrapper#621|0|0|DEVICE|0|0012202712|0.00.01220.02712.0|[]--------------------------------------------------------------------------------------------------------------------------------------------------------------- com.miui.home/com.miui.home.launcher.Launcher#930283|1|0|DEVICE|0|0012202712|0.00.01220.02712.0|[]---------------------------------------------------------------------------------------------------------------------------------------------------------------Task=6181#6797111|0|0|CLIENT|0|04611431682|0.00.00.00.0|[]--------------------------------------------------------------------------------------------------------------------------------------------------------------- com.android.mms/com.android.mms.ui.MmsTabActivity#9306713|1|0|CLIENT|0|1832958941433|0.00.01220.01952.0|[*]--------------------------------------------------------------------------------------------------------------------------------------------------------------- Miui Caption ofTask=6181#9307514|0|0|CLIENT|0|509321569333|0.00.060.012.0|[]--------------------------------------------------------------------------------------------------------------------------------------------------------------- Miui Bottom Caption ofTask=6181#9307715|0|0|CLIENT|0|45014076271419|0.00.0305.012.0|[]--------------------------------------------------------------------------------------------------------------------------------------------------------------- StatusBar#12119|2000|0|DEVICE|0|001220122|0.00.01220.0122.0|[]--------------------------------------------------------------------------------------------------------------------------------------------------------------- NavigationBar0#12020|2019|0|DEVICE|0|0266412202712|0.00.01220.048.0|[]---------------------------------------------------------------------------------------------------------------------------------------------------------------可以看出上面图层中没有看到有拖拽过程展示的提示圆角
这块预计是在sf中的skia绘制的。
放大进入全屏的功能
这里在自由窗口进行拖动放到时候会检测是否到了阈值,一旦到了阈值后,自由窗口显示变成一个图标,还会展示一个提升圆角背景。
退出自由窗口的相关交互方式
最小化退出方式
缩放到最小退出方式
拖动自由窗口最右侧交互最小化功能
在自由窗口展示时候,整体拖动自由窗口到屏幕最右侧,既可以展示一个自由窗口app的一个图标,这个图标一般只有一半内容展示在屏幕内。
可以看看这个屏幕侧边的图标图层:
它实际是MiuiBubbles图层,实际这个图层处于顶层,由systemui进程创建,而且他的展示大小还是w=1220 h=2712,相关window信息如下:
Window#1 Window{9274ecc u0 MiuiBubbles}:mDisplayId=0mSession=Session{38089254456:1000}mClient=android.os.BinderProxy@dddc59mOwnerUid=1000showForAllUsers=truepackage=com.android.systemuiappop=NONEmAttrs={(0,0)(fillxfill)gr=TOP CENTER_VERTICALsim={adjust=resize}layoutInDisplayCutoutMode=always pkg=com.android.systemui adpkg=nullty=MAGNIFICATION_OVERLAYfmt=TRANSLUCENTfl=NOT_FOCUSABLE NOT_TOUCH_MODAL HARDWARE_ACCELERATEDpfl=SHOW_FOR_ALL_USERS FIT_INSETS_CONTROLLED TRUSTED_OVERLAYbhv=DEFAULTframeRateBoostOnTouch=truedvrrWindowFrameRateHint=true}Requestedw=1220h=2712mLayoutSeq=118110mBaseLayer=281000mSubLayer=0mToken=WindowToken{d70201etype=2027android.os.BinderProxy@79648a0}-topChild=Window{9274ecc u0 MiuiBubbles}mViewVisibility=0x0mHaveFrame=truemObscured=falsemGivenContentInsets=[0,0][0,0]mGivenVisibleInsets=[0,0][0,0]mTouchableInsets=3mGivenInsetsPending=false touchableregion=SkRegion((1148,656,1340,848))可以看到这个图层显示大小是 w=1220 h=2712 但是它大部分区域都是透明的,只有在SkRegion((1148,656,1340,848))这个区域是显示的,而且可以触摸的。
点击最右侧这个图标可以,既可以进入自由窗口尺寸最小的
原文地址:
https://mp.weixin.qq.com/s/xOR3YcPrKbS_rhmDoiRmOQ