顺 “瓜” 摸 “藤”(鸿蒙开发)—— 3. 应用的侧边栏(仿小红书📕)
1. 引子
我们在开发时,会有突发奇想或者看到好的设计,希望能够模仿,但是会有处于毫无头绪的时候,不知道该如何下手,这就相当于一个考试,给你一个题目叫你作答,但不同于校园考试,他并不是在给定你范围并且复习的情况下进行作答。它是未知的,并不是顺藤摸瓜,总会遇到你所不清楚的内容,我希望能够通过案例顺瓜摸藤进行学习,通过“瓜”来推出是什么“藤”。
2. 注
这些案例都是现有APP的形式进行推论,因本人能力有限,可能不会是最优方案,如果您有更优方案,欢迎指出并讨论。
从顺“瓜”摸“藤”系列第三个案例开始,不再开发状态管理V1版本,只开发V2版本,若不分基础与进阶表示该案例处于相对复杂的案例。
该系列的代码全部开源
在github
https://github.com/JinnyWang-Space/HMOS_Space
或者gitee
https://gitee.com/jinnywang/HMOS_Space
上均可查看,下载使用
3. 案例
应用的侧边栏
小红书的案例是侧边栏的一种,后续会持续更新其他类型侧边栏,以其他APP为案例。
视频加载中...
小📕
案例分析
1. 应用的侧边栏通过左上角的按钮控制,侧边栏展开时覆盖当前整个页面。
2. 侧边栏展开时,只能通过返回键 / 系统滑动返回或者点击侧边栏以外的页面进行关闭,侧边栏是不可滑动关闭。
3. 侧边栏展开时,被覆盖的页面可以看出有明显的变暗效果,并且内容区处于不可交互状态。
4. 侧边栏展开时,无论什么情况,一旦进入前台,则会自动关闭侧边栏。
5. 仔细观察会发现,不一定点击按钮展开侧边栏,实际点击效果区域会比按钮大小要大。
4. 知识点
4.1 SideBarContainer (侧边栏容器)
文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-sidebarcontainer
4.2 enabled (禁用控制)
文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-universal-attributes-enable
4.3 opacity (透明度设置)
文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-universal-attributes-opacity
4.4 AppStorageV2 (应用全局UI状态存储)
文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-new-appstoragev2
4.5 onDidForeground (UIAbility生命周期)
文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-app-ability-uiability#ondidforeground20
新手可能对于生命周期不太了解,想了解 UIAbility生命周期,请查看该文档:
文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/uiability-lifecycle
4.6 自定义构建函数 (@Builder)
文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-builder
4.7 @ohos.promptAction (弹窗)
4.8 expandSafeArea(拓展安全区)
5. 代码
5.1 状态管理V2版
5.1.1 数据中心
1// 小红薯数据中心(UI状态存储)
2@ObservedV2
3export class RBTmpDataV2 {
4 // 监听侧边栏是否显示
5 @Trace isShowSideBar: boolean = false;
6}5.1.2 UIAbility组件
用于控制在应用进到前台时,进行数据变化(即:侧边栏处于开启时,关闭)
1export default class EntryAbility extends UIAbility {
2 rbTmpDataV2: RBTmpDataV2 = AppStorageV2.connect<RBTmpDataV2>(RBTmpDataV2, () => new RBTmpDataV2())!;
3 // 其他生命周期,不要去掉,去错会出现问题
4 ...
5
6 // 应用进入前台(随时)
7 onDidForeground(): void {
8 // 如果当前控制栏处于打开状,则关闭
9 if (this.rbTmpDataV2.isShowSideBar) {
10 animateToImmediately({
11 duration: 200,
12 curve: Curve.Linear
13 }, () => {
14 this.rbTmpDataV2.isShowSideBar = false;5.1.3 视图页面
1import { AppStorageV2, promptAction } from "@kit.ArkUI";
2import { RBTmpDataV2 } from "../viewmodel/RBTmpData";
3
4// 3. 应用的侧边栏(小红书)
5// V2 版代码
6@ComponentV2
7export struct SideBarRedBookV2 {
8 // 创建 APPStorageV2 存储小红书全局 UI 的数据中心
9 @Local rbTmpDataV2: RBTmpDataV2 = AppStorageV2.connect<RBTmpDataV2>(RBTmpDataV2, () => new RBTmpDataV2())!;
10
11 // 侧边栏区
12 @Builder
13 sidebarView() {
14 Column({ space: 8 }) {5.1.4 入口页面
1import { AppStorageV2 } from '@kit.ArkUI';
2import { SideBarRedBookV2 } from '../view/SideBarView';
3import { RBTmpDataV2 } from '../viewmodel/RBTmpData';
4
5@Entry
6@ComponentV2
7struct Index {
8 // 创建 APPStorageV2 存储小红薯全局 UI 的数据中心
9 @Local rbTmpDataV2: RBTmpDataV2 = AppStorageV2.connect<RBTmpDataV2>(RBTmpDataV2, () => new RBTmpDataV2())!;
10
11 // 系统返回操作
12 // true 代表拦截返回操作,false 代表不拦截返回操作
13 onBackPress(): boolean | void {
14 if (this.rbTmpDataV2.isShowSideBar) {6. 实现效果
视频加载中...
实现效果
实现效果
1. 点击右上角按钮,侧边栏展开并且覆盖当前页面。
2. 侧边栏展开时,通过返回键 / 系统滑动返回或者点击侧边栏以外的页面进行关闭,侧边栏不可滑动关闭。
3. 侧边栏展开时,被覆盖的页面可以看出有明显的变暗效果,并且内容区处于不可交互状态,只有侧边栏关闭时,内容区才可进行交互。
4. 侧边栏展开时,无论什么情况,一旦应用进入前台,则会自动关闭侧边栏。
🎉 恭喜你!完成鸿蒙开发案例中的应用的侧边栏