鸿蒙UI开发——设置组件的内容填充方式

1、场景描述

组件在宽高变化时,如果我们设置了动画效果,但该组件同时又有内容,此时,可能会出现组件有动画效果,但组件包含的内容没有动画的问题。

我们以Text文本组件为例:

如果Text文本组件中有包含文字,此时我们将组件的尺寸变更触发动画时,可能会出现以下效果:

图片

从上述效果中我们可以看到,Text组件的宽高变化是按照动画平滑过渡,但是里面包含的文字发生了跳变,我们希望里面的文字也随着动画发生平滑过渡。效果如下(文章末尾有源码):

图片

为了达到后者的效果,我们可以通过为组件设置renderFit属性来实现。

2、renderFit

属性接口定义如下:

设置宽高动画过程中的组件内容填充方式。(当不设置renderFit属性时,取默认值RenderFit.TOP_LEFT)

// 设置宽高动画过程中的组件内容填充方式。renderFit(fitMode: RenderFit)

其中RenderFit的值是枚举,介绍如下:

名称描述示意图
CENTER保持动画终态的内容大小,并且内容始终与组件保持中心对齐。

图片

TOP保持动画终态的内容大小,并且内容始终与组件保持顶部中心对齐。

图片

BOTTOM保持动画终态的内容大小,并且内容始终与组件保持底部中心对齐。

图片

LEFT保持动画终态的内容大小,并且内容始终与组件保持左侧对齐。

图片

RIGHT保持动画终态的内容大小,并且内容始终与组件保持右侧对齐。

图片

TOP_LEFT保持动画终态的内容大小,并且内容始终与组件保持左上角对齐。

图片

TOP_RIGHT保持动画终态的内容大小,并且内容始终与组件保持右上角对齐。

图片

BOTTOM_LEFT保持动画终态的内容大小,并且内容始终与组件保持左下角对齐。

图片

BOTTOM_RIGHT保持动画终态的内容大小,并且内容始终与组件保持右下角对齐。

图片

RESIZE_FILL不考虑动画终态内容的宽高比,并且内容始终缩放到组件的大小。

图片

RESIZE_CONTAIN保持动画终态内容的宽高比进行缩小或放大,使内容完整显示在组件内,且与组件保持中心对齐。

图片

RESIZE_CONTAIN_TOP_LEFT保持动画终态内容的宽高比进行缩小或放大,使内容完整显示在组件内。当组件宽方向有剩余时,内容与组件保持左侧对齐,当组件高方向有剩余时,内容与组件保持顶部对齐。

图片

RESIZE_CONTAIN_BOTTOM_RIGHT保持动画终态内容的宽高比进行缩小或放大,使内容完整显示在组件内。当组件宽方向有剩余时,内容与组件保持右侧对齐,当组件高方向有剩余时,内容与组件保持底部对齐。

图片

RESIZE_COVER保持动画终态内容的宽高比进行缩小或放大,使内容两边都大于或等于组件两边,且与组件保持中心对齐,显示内容的中间部分。

图片

RESIZE_COVER_TOP_LEFT保持动画终态内容的宽高比进行缩小或放大,使内容的两边都恰好大于或等于组件两边。当内容宽方向有剩余时,内容与组件保持左侧对齐,显示内容的左侧部分。当内容高方向有剩余时,内容与组件保持顶部对齐,显示内容的顶侧部分。

图片

RESIZE_COVER_BOTTOM_RIGHT保持动画终态内容的宽高比进行缩小或放大,使内容的两边都恰好大于或等于组件两边。当内容宽方向有剩余时,内容与组件保持右侧对齐,显示内容的右侧部分。当内容高方向有剩余时,内容与组件保持底部对齐,显示内容的底侧部分。

图片

3、Demo

第一章节中的动画实例如下(文字与外部的容器保持相对关系,有平滑的动画效果):

图片

具体实现代码如下(25行、34行、39行):​​​​​​​

@Entry@Componentstruct RenderFitExample {  @State w: number = 250; // w为宽,h为高  @State h: number = 100;  @State text: string = '鸿蒙自习室';  flag: boolean = false;  toggleSize = () => {    const widthOffset = 50, heightOffset = 40;    const i = this.flag  ? 1 : -1;    this.flag = !this.flag;    this.w += widthOffset * i;    this.h += heightOffset * i;  }  build() {    Column() {      Text(this.text)        .width(this.w)        .height(this.h)        .borderWidth(1)        .textAlign(TextAlign.Start)        .backgroundColor(Color.Pink)        .renderFit(RenderFit.LEFT) // 设置LEFT的renderFit,动画过程中,动画的终态内容与组件保持左对齐        .margin(20)      Text(this.text)        .width(this.w)        .height(this.h)        .textAlign(TextAlign.Center)        .backgroundColor(Color.Orange)        .borderWidth(1)        .renderFit(RenderFit.CENTER) // 设置CENTER的renderFit,动画过程中,动画的终态内容与组件保持中心对齐        .margin(20)      Button("animate")        .onClick(() => {          animateTo({ curve: Curve.Ease }, this.toggleSize)        })    }.width("100%").height("100%").alignItems(HorizontalAlign.Center)  }}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值