鸿蒙NEXT开发笔记(十九)仿抖音快手App的相对布局

上一节我们利用photoAccessHelper实现了从相册挑选视频的功能,但在短视频APP界面,视频画面上还叠加了若干交互图标,包括但不限于:点赞、收藏、评论、分享等等。那么在某个组件上叠加显示其他组件,就用到了相对布局这个容器。
鸿蒙SDK提供的相对布局叫做RelativeContainer组件,相对布局内部的各个子组件按照指定位置排列,如果两个子组件同时覆盖了某块区域,后来的子组件画面将覆盖先来的子组件画面。
所谓相对布局,指的是内部组件相对于其他组件来决定自身的位置。而被其他组件拿来参考位置的标记组件,鸿蒙系统称之为锚点。这个锚点既可能是子组件的上级容器也就是相对布局,也可能是子组件的平级组件。
对于相对布局的锚点标识,SDK固定分配了“__container__”表示当前RelativeContainer组件。对于内部组件的锚点标识,则需提前给锚点组件分配id,也就是在引入锚点组件时添加“.id('tx_center')”,其中tx_center可替换为自己定义的锚点标识。
RelativeContainer的子组件通过alignRules方法指定自身的相对位置,该方法有middle和center两个参数,其中middle用于设置水平方向的位置,center用于设置垂直方向的位置。不管是水平方向还是垂直方向,都要指定当前方向的锚点标识anchor,以及该方向上的对齐方式align。具体的alignRules方法调用格式如下所示:

.alignRules({
  middle:{ anchor: '水平方向的锚点标识', align: 水平方向的对齐方式}, // middle表示水平方向
  center:{ anchor: '垂直方向的锚点标识', align: 垂直方向的对齐方式} // center表示垂直方向
})

若想让某个子组件位于相对布局的正中央,则可调用下面的alignRules方法。在水平和垂直两个方向上都把上级容器__container__作为锚点,对齐方式也都采用了居中对齐。

.alignRules({
  middle:{ anchor: '__container__', align: HorizontalAlign.Center},
  center:{ anchor: '__container__', align: VerticalAlign.Center}
})

水平方向的对齐方式除了HorizontalAlign.Center表示居中对齐,还有HorizontalAlign.Start表示靠左对齐,以及HorizontalAlign.End表示靠右对齐。垂直方向的对齐方式除了VerticalAlign.Center表示居中对齐,还有VerticalAlign.Top表示靠上对齐,以及VerticalAlign.Bottom表示靠下对齐。
除了以上级容器作为锚点,还能以平级组件作为锚点,注意锚点组件要提前分配id标识,然后目标组件在alignRules方法的anchor属性设置锚点的id,表示参考该id的锚点组件来决定自身位置。比如下面代码先放入一个居中的文本组件,再放入两个参考中央文本位置的另外两个文本组件。

RelativeContainer() {
  Text('我在中间').fontSize(17)
    .id('tx_center') // 锚点组件需要分配id标识
    .alignRules({
      middle:{ anchor: '__container__', align: HorizontalAlign.Center},
      center:{ anchor: '__container__', align: VerticalAlign.Center}
    })
  Text('中间上面').fontSize(17)
    .backgroundColor('#ffff00')
    .alignRules({
      left:{ anchor: 'tx_center', align: HorizontalAlign.Start},
      bottom:{ anchor: 'tx_center', align: VerticalAlign.Top}
    })
  Text('中间右边').fontSize(17)
    .backgroundColor('#ffff00')
    .alignRules({
      left:{ anchor: 'tx_center', align: HorizontalAlign.End},
      top:{ anchor: 'tx_center', align: VerticalAlign.Top}
    })
}
.width('100%').height(300)

从上面代码可知,第一个文本组件相对于上级容器居中放置,并且分配了tx_center的id标识。第二个和第三个文本组件都参考了第一个名叫tx_center的平级组件,且第二个文本组件与tx_center锚点朝左朝上对齐,第三个文本组件与tx_center锚点朝右朝上对齐。完整的相对布局效果如下所示。

下一篇文章会介绍如何使用滑块Swiper来轮播图片。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值