
【基础|动图+代码】自适应上下/左右布局|鸿蒙动效开发笔记 03 原创
这篇笔记将介绍一种 HarmonyOS NEXT 开发里,标题+内容根据屏幕大小,自适应选择上下/左右排列的布局实现方式!
ヽ( ̄ω ̄( ̄ω ̄〃)ゝ 前置知识:
GIF 案例,从 .animation() 到 Curves.springMotion|鸿蒙动效笔记 01
和一点点鸿蒙开发基础(工程结构、ArkTS 语法)。
实现效果:
参考代码:
整个笔记的展示项目已经开源:
阅读笔记时可以(临时)单独对照浏览这个:
整体思路:
使用的术语
横排/竖排:分别对应左右/上下布局;
标题区域:左/上区域,用于显示标题文字;
内容区域:右/下区域,用于显示自定义内容/组件。
竖排
首先,在竖排情况下,整个页面要能够滚动,因此选择 Scroll
然后,要实现两个区域的上下/左右切换,Liny 选择将万能的 RelativeContainer(因为布局很自由,并且切换布局位置(属性变化)时方便加动画)放在 Scroll 里。
接着,两个区域本身可以用任何容器实现,不过 Liny 希望横排的时候内容区域能够单独滚动起来,于是使用了 Scroll 套 Column
同时,在竖排情况下,我们希望上下两个区域是同级的,滚动的时候一起滚动,于是就要判断在竖排是锁定内容区域,让它和标题区域一起滚起来。
布局 alignRules 配置:
横排
横排情况相对简单:我们希望滚动的时候标题不动,只滚动内容区域即可 → 于是锁定根容器 Scroll,解锁内容区域 Scroll。
布局 alignRules 配置:
布局结构
额外说明
关于区域布局
这个案例通过给根部的 Scroll 设置 onAreaChange 检测整个布局的大小,并且将得到的长宽减去间隔(10 vp)后保存。然后根据这组数据判断是否是横排模式(this.landscapeLayout)。
这样,两个区域的布局就可以根据这些数据,决定自己的布局方式:
也可以按比例计算后得到自己的尺寸了:
关于滚动
竖排时,为了实现两个布局的一体化滚动,这里禁用其滚动属性(.enableScrollInteraction()),让滚动操作由根部的大 Scroll 响应,就能滚在一起了。
并且,为了在锁定后不遮挡内容区域内容,我们让内容区域的 Scroll 和其子组件 Column 高度相等。这需要我们检测 Column 高度的变化,并且同步到 Scroll。
(方案可以优化,期待评论区解法!)
横排时则解锁内容区域的滚动,锁住根部大 Scroll 的滚动,就能只滚内容区域了!
关于封装
Liny 在这里把这个东西封装了出来,只需要传入标题和副标题作为参数,以及一个或多个子组件即可使用。于是你会发现这个布局也出现在了《动画堆》Demo 的首页。
给自定义组件传入一个子组件参考:@BuilderParam 装饰器。
一些后话
同样的,这个文章所介绍的方案也存在诸多不足:代码冗长,属性众多……必然存在不小的优化空间。如果文章内容中含有错误,也请评论区各路大佬斧正!ORZ。
最后的最后,感谢你读到这里!咱们下一篇鸿蒙动效开发笔记再见!!(~o ̄3 ̄)~
