鸿蒙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)  }}
### 鸿蒙开发中 `backgroundColor` 设置透明的方法 在鸿蒙应用开发过程中,对于不同类型的UI组件设置背景颜色为透明有不同的处理方式。 针对普通组件如Text等可以通过`.opacity()`方法调整不透明度实现视觉上的透明效果[^1]: ```typescript Text("Sample Text").opacity(0) ``` 然而这种方法并不适合按钮(Button)这类容器型控件,因为这会使内部子元素一同变得透明。此时应采用特定的颜色编码来指定完全透明的背景色。具体做法是在调用`.backgroundColor()`时传入代表全透明色彩值——十六进制形式下省略掉RGB部分仅保留Alpha通道置零的形式,在某些情况下表现为类似于`0x00FFFFFF`这样的值: ```typescript Button() { Image($r("app.media.kaishi")) .width(230) .height(30); } .position({ x: 80, y: 260 }) .backgroundColor(0x00000000); // 完全透明背景色 ``` 值得注意的是,上述代码片段中的颜色值`0x00000000`前四位表示alpha(透明度),后六位分别对应红绿蓝三原色强度;此处全部设为最低值意味着无任何色素即呈现透明状态。 另外一种思路是利用带有状态管理机制的状态变量配合动画效果渐变至目标透明程度,这种方式更灵活多变适用于动态场景下的交互设计[^2]: ```typescript @Entry @Component struct MyComponent { @State private backgroundColorValue: number = 0xFFFFFFFF; build() { Column() { Button('Click Me') .onClick(() => { this.backgroundColorValue = 0x00FFFFFF; }) .backgroundColor(this.backgroundColorValue); } } } ``` 此段示例展示了通过点击事件触发改变按钮背景颜色的过程,其中初始状态下赋予了一个白色(`0xFFFFFFFF`)实心填充作为对比参照物,当用户操作发生后切换成接近于无形体特征的淡出样式结束整个过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值