Open Gaubee opened 5 months ago
我们基于 Manifest/display 提供对应的方案
该模式一般用于游戏类、视频类、沉浸类应用,在该模式下,状态栏与导航栏都会被隐藏 [ ] 这种模式将进入真正意义上的全屏,但不是独立的 Activity,而是类似多桌面模式,这个应用会被独立渲染在一个单独的桌面空间(workspace)中 [ ] 我们将提供一个“浮动按钮”,按钮中显示着应用图标,点击它会展开成“全屏控制栏”(展开缩小的动画时间大概时 300ms,需要比较快的动画,同时不也要有一定的视觉暂留时间来告知用户) [ ] “浮动按钮”可以被拖拽改变位置 [ ] 每次在 workspace 被激活的时候,“浮动按钮”都会展开成一个 toast,告诉用户:“滑动顶部或者底部边缘,可以展开控制栏”,如果用户没有操作,2s 后,它会缩小成“浮动按钮” [ ] 单击“浮动按钮”也可以展开控制栏 [ ] “浮动按钮”总是贴边渲染,会贴在屏幕方向的两侧,并且会与顶部与底部保持安全触摸的距离,确保不感染系统手势 [ ] 控制栏中会提供“退出全屏”的功能 [ ] 控制栏会显示应用基本信息:logo+appid+version [ ] 控制栏显示时,其区域以外的手势操作仍然会触发到应用里头,不会被 mask 消费掉,从而防止游戏模式下的操作丢失的行为 [ ] 控制栏显示时,再执行返回手势,那么会直接触发“退出全屏” [ ] 控制栏可以被接口控制进行打开 未来如果 dweb-ui 开发完善,那么控制栏可以被二次开发,用户可以提供一些自定义的功能或者组件,从而满足比如视频控制、视频进度等需求 [ ] 如果用户在唤出全屏控制栏后却没有对控制栏进行操作,而是在其它地方进行操作,那么在展开动画完成后、并等待 200ms 后,全屏控制栏会自动缩小回去。
该模式一般用于游戏类、视频类、沉浸类应用,在该模式下,状态栏与导航栏都会被隐藏
该模式用于应用类,在该模式下,状态栏导航栏都存在,同时应用顶部和底部还有存在一些基本的应用信息 [ ] 应用顶部会居中显示“应用名称”的信息,显示的大小参考 IOS 应用中,左上角“返回来源应用”的文字大小 可以从 Apple Store 打开某一个应用就能看到这行左上角的小字 [ ] 应用底部会显示 appid+version 的信息 [ ] 我们将提供一个“浮动按钮”,按钮中显示着“应用图标”,以及“显示桌面”的图标 [ ] 点击“应用图标”,会展开菜单面板 [ ] 点击“显示桌面”,应用将会最小化
该模式用于应用类,在该模式下,状态栏导航栏都存在,同时应用顶部和底部还有存在一些基本的应用信息
该模式是最适合开发传统原生应用的模式,它在 standalon 的基础上,提供了系统级的应用顶栏 “应用顶栏(app-top-bar)”是控制栏与标题栏会合并渲染而成的 在 IOS 中,我们可以使用原生的 UINavigationBar 来进行实现,效果是最好的 在 Android 中,我们使用 Jetpack Compose 提供的 Top app bars 来进行实现 [ ] 应用顶栏的左上角是返回按钮,符合传统返回按钮在顶部的习惯 [ ] 应用顶栏的中间是 “窗口页标题”,默认会使用 “应用名称”。 [ ] 如果使用 webview 渲染,它会自动使用 document.title 作为 “窗口页标题”。 [ ] 点击应用顶栏,可以展开菜单面板 [ ] 向下拖拽应用顶栏,可以解除最大化模式,进入浮动窗口的模式 [ ] 应用顶栏的右上角默认是“胶囊”,其中胶囊左边是“应用图标”,右边是“显示桌面” [ ] 点击“应用图标”,会显示“应用控制栏”与“菜单面板” [ ] 点击“显示桌面”,应用将会最小化 [ ] 应用可以配置应用顶栏的样式和风格,参考 ionic 的 ion-header 组件 [ ] 应用可以配置 overlay 模式,那么会使用 env(safe-area) 来提供给页面 目前 safe-area 是通过一些私有手段达成的,可能不长远,所以建议还是用 var(safe-area) 来解决。 [ ] 应用的底部是 app-bottom-bar,一般来说它只显示 appid 和 version。 未来随着 dweb-ui 的完善,app-bottom-bar 可以被二次开发注入一些组件,从而保证了其灵活性与性能
该模式是最适合开发传统原生应用的模式,它在 standalon 的基础上,提供了系统级的应用顶栏 “应用顶栏(app-top-bar)”是控制栏与标题栏会合并渲染而成的 在 IOS 中,我们可以使用原生的 UINavigationBar 来进行实现,效果是最好的 在 Android 中,我们使用 Jetpack Compose 提供的 Top app bars 来进行实现
参考 Android/Google-map 与 Android/didi 拉动 bottom-sheet 到顶部后在顶部创建搜索栏的交互特性
总的来说,我们消除了原本在底部的控制栏带来的问题,并且进一步优化了控制栏与标题栏与应用顶栏三者的关系
我们基于 Manifest/display 提供对应的方案
窗口浮动模式
在窗口模式下,一些扩展交互
1. - [ ] 触摸标题栏时,会立刻进入移动模式 > 参考 Android-Youtube 应用中,播放列表的拖动排序的反馈 1. - [ ] 如果移动量少于 5pt,且少于专业模式的触发时间阈值,那么属于 tap/click 操作 1. - [ ] 在移动模式下,控制栏会显示的一些图标槽,推动到槽内,会触发震动,松手会触发相应功能 1. - [ ] 图标槽包括“建议布局”、“最大化”、“置顶”、“画中画”、“跨设备流转”,这些功能其实在“应用菜单>应用控制页”都能找到,只不过这里额外提供 > 目前只需要提供“最大化” > 跨设备流转首先需要应用声明支持。比方说 Web 应用本质就是提供一个 http-url 和 http-headers,然后在另外一个设备进行打开这个网页。未来 plaoc 也许会使用 yjs 提供默认支持。 > 否则跨设备流转就要使用截屏推流的功能?这点我不建议,我个人建议使用 Web 的能力来做这个事情,尽可能放大 Web-API 所能带来的体验,并且在另外一个设备上使用它自己的 webview 进行渲染,体验绝大多数情况下是更好的。不然像现在 Android 做的跨设备流转,本质是一种推流的模式,这就导致它天生是不能多设备同时协作的,而 OpenHarmony 会更类似 web,它会将代码与数据分发到另外的设备上,然后独立运行。而 Web 天生支持动态渲染,因此能在同时在多个设备上,用各自设备的最佳屏幕尺寸进行独立渲染,我觉得这是更加先进的。 > 并且 Web 这种协作,我们可以提供一些社区组件来减轻开发者的负担,比方说提供 sync-zone 组件:即便页面都是独立渲染,但是这个组件可以让用户在`窗口最大化模式
辅助参考资料
1. [compose nested-scrolling-interop](https://developer.android.com/jetpack/compose/touch-input/pointer-input/scroll?hl=zh-cn#nested-scrolling-interop) 1. [Nested Scrolling with Android Webviews](https://engineering.telefonica.com/nested-scrolling-with-android-webviews-54e0d67e1c23)应用在启动阶段,不会显示窗口,而只会显示控制栏
终述
总的来说,我们消除了原本在底部的控制栏带来的问题,并且进一步优化了控制栏与标题栏与应用顶栏三者的关系