合作咨询
我们的专家服务团队将竭诚为您提供专业的合作咨询服务
转场动画期望由大缩小,且动画连贯流畅。但是实际的情况是,当页面显示发生转场,页面中圆初始显示为小的状态,待延时结束,再突然变大,然后由大缓慢缩小。其中突然变大导致整体效果不连贯,如何实现转场动画从页面开始显示,圆一直保持大的状态到延时结束,然后缩小?
问题代码示例参考如下:
@Entry @ComponentV2 struct ShackHand { @Param serverActive: boolean = false // 动画点信息 @Local colorArray: Array<JumpTrans> = [ new JumpTrans('#8002ECFC', 500), new JumpTrans('#802d2de3', 1000), new JumpTrans('#8002ECFC', 1500), new JumpTrans('#802d2de3', 2000), new JumpTrans('#8002ECFC', 2500), ] build() { RelativeContainer() { ForEach(this.colorArray, (jump: JumpTrans, index: number) => { Circle({ width: '180lpx', height: '180lpx' }) .stroke(Color.White) .margin({ left: index * 30 }) .strokeWidth('5lpx') .fill(jump.color) .transition(generateEffect(jump.delay)) // 设置动画效果 }) } .backgroundColor(Color.Black) .width('600lpx') .height('600lpx') } } // 动画效果 function generateEffect(delay: number): TransitionEffect { return TransitionEffect.scale({ x: 0.1, y: 0.1 }) .animation({ duration: 1000, playMode: PlayMode.Reverse, // 动画反向播放 delay: delay }) } // 信息类 class JumpTrans { color: ResourceColor delay: number constructor(color: ResourceColor, delay: number) { this.color = color this.delay = delay } }
问题效果预览:


该问题涉及动画播放的两个阶段:
由上述可知动画播放之前形态和动画开始形态有较大差距,因此出现突兀变化。
delay和PlayMode.Reverse属性设置不当会导致动画播放前出现组件形态的突兀变化,因此不建议组合使用。
若有延时效果,建议使用PlayMode.Normal,同时动画效果与目标状态翻转设置一下即可。
完整示例参考如下:
@Entry @ComponentV2 struct JumpTransCustom { // 动画数据 @Local colorArray: Array<JumpTrans> = [ new JumpTrans('#8002ECFC', 500), new JumpTrans('#802d2de3', 1000), new JumpTrans('#8002ECFC', 1500), new JumpTrans('#802d2de3', 2000), new JumpTrans('#8002ECFC', 2500), ]; build() { Column() { RelativeContainer() { ForEach(this.colorArray, (jump: JumpTrans, index: number) => { Circle({ width: '180lpx', height: '180lpx' }) .stroke(Color.White) .margin({ left: index * 30 }) .strokeWidth('5lpx') .fill(jump.color) .transition(generateEffect(jump.delay)) // 调用动画函数 .scale({ x: 0.1, y: 0.1 }); }); } .backgroundColor(Color.Black) .width('600lpx') .height('600lpx'); }; } } // 动画效果 function generateEffect(delay: number): TransitionEffect { return TransitionEffect.scale({ x: 8, y: 8 }) .animation({ duration: 1000, playMode: PlayMode.Normal, delay: delay }); } // 数据类 class JumpTrans { color: ResourceColor; delay: number; constructor(color: ResourceColor, delay: number) { this.color = color; this.delay = delay; } }