鸿蒙组件transform变形及animateTo动画效果实践
鸿蒙ArkUI里的组件可以实现各种各样的变形及动画效果,比如我想将一张图片进行缩放操作,可以在 X、Y、Z 轴上独立设置缩放比例,示例代码如下:
@Entry
@Component
struct EffectDemo {
build() {
Column(){
Image($r('app.media.startIcon'))
.width(200)
.height(200)
.transform({ scale: { x: 1.5, y: 1.0, z: 0.8 } })
}
}
}可在真机上运行的时候发现并没有达到预期的图片缩放效果,查看SDK源码得知,要实现缩放操作,还可以直接调用scale方法,将上述代码改变如下:
@Entry
@Component
struct EffectDemo {
build() {
Column(){
Image($r('app.media.startIcon'))
.width(200)
.height(200)
.scale({ x: 1.5, y: 1.0, z: 0.8 })
}
}
}在真机上运行就能看到图片已经按照给定参数实现缩放变形了,也就是说调用transform方法并不能实现平移(Translate)、2. 旋转(Rotate)、3. 缩放(Scale)等变形效果了,需要调用对应的专用方法translate、rotate及scale方法名。下面再举例一个rotate旋转变形代码如下:
@Entry
@Component
struct EffectDemo {
build() {
Column(){
Image($r('app.media.startIcon'))
.width(200)
.height(200)
// 没有效果
// .transform({ rotate: { angle: 45 } })
// 有效果
.rotate({ angle: 45 })
}
}
}一、animateTo实现单个动画效果
复用上面的例子,用animateTo实现单个scale缩放动画,示例代码如下:
@Entry
@Component
struct EffectDemo {
@State
scaleX: number = 1
build() {
Column(){
Image($r('app.media.startIcon'))
.width(200)
.height(200)
.scale({x: this.scaleX})
.onClick(()=>{
animateTo({
duration: 10000,
}, () => {
this.scaleX = 2;
})
})
}
}
}用animateTo实现单个rotate旋转动画,示例代码如下:
@Entry
@Component
struct EffectDemo {
@State
angle: number = 0
build() {
Column(){
Image($r('app.media.startIcon'))
.width(200)
.height(200)
.rotate({angle: this.angle})
.onClick(()=>{
animateTo({
duration: 1000,
}, () => {
this.angle = 45;
})
})
}
}
}二、animateTo实现串行动画效果
使用animateTo实现单个动画都没问题,那么如何使用animateTo实现串行动画效果呢?答案就在animateTo的第一个参数AnimateParam里面,AnimateParam是一个接口类型,它里面有一个属性onFinish可以接受一个回调函数用于在动画结束后执行,我们可以用给onFinish传回调函数的方式实现串行动画,示例代码如下:
@Entry
@Component
struct EffectDemo {
@State
scaleX: number = 1
@State
angle: number = 0
build() {
Column(){
Image($r('app.media.startIcon'))
.width(200)
.height(200)
.scale({x: this.scaleX})
.rotate({angle: this.angle})
.onClick(()=>{
animateTo({
duration: 10000,
onFinish: ()=>{
animateTo({
duration: 1000,
}, () => {
this.angle = 45;
})
}
}, () => {
this.scaleX = 2;
})
})
}
}
}