HarmonyOS 鸿蒙Next点击礼物的动画效果

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

HarmonyOS 鸿蒙Next点击礼物的动画效果 1、Grid中选中某个Item出现可以先放大后出现外面转圈的动画效果
2、长按可以一直让重复这种效果

2 回复
楼主你好,可以参考下面demo:

@Entry
@Component
struct Index {
data: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
@State length: number = 60
@State fIndex: number = 0
@State isChange: boolean = false
@State nLength: number = 60
@State fontSizeInfo01: number = 10
@State fontSizeInfo02: number = 15
@State valueInfo: number = 0
@State count: number = 1
@State fontSizeInfo03: number = 18
uiContext: UIContext | undefined = undefined;

aboutToAppear(): void {
this.uiContext = this.getUIContext?.();
}

onPageShow(): void {
if (this.fIndex === 0) {
this.length = 60
setTimeout(() => {
this.length = 70
}, 50)
}
}

build() {
Column({ space: 20 }) {
Grid() {
ForEach(this.data, (item: number, index: number) => {
GridItem() {
Column() {
Column() {
if (this.fIndex === index && this.isChange) {
Column() {
Row(){
Text("X")
.fontColor(Color.Black)
.fontWeight(700)
.fontSize(13)
Text(this.count.toString())
.fontColor(Color.Black)
.fontWeight(700)
.fontSize(this.fontSizeInfo03)
}
Stack() {
Column() {
Text("长按").fontSize(this.fontSizeInfo01).fontColor(Color.White).margin({ top: 12 })
Text("点击").fontSize(this.fontSizeInfo02).fontColor(Color.White).margin({ top: 5 })
}
.opacity(0.8)
.width(this.nLength)
.height(this.nLength)
.borderRadius(this.nLength / 2)
.backgroundColor(Color.Orange)
Column() {
Progress({ value: this.valueInfo, total: 100, type: ProgressType.Ring })
.width(this.nLength)
.height(this.nLength)
.color(Color.Blue)
.style({ strokeWidth: 5 })
.onTouch((event: TouchEvent) => {
console.log("OnTouch + " + JSON.stringify(event.type));
if (TouchType.Up == event.type) {
console.log("message == up");
this.nLength = 60
this.fontSizeInfo01 = 10
this.fontSizeInfo02 = 15
this.fontSizeInfo03 = 15
this.valueInfo = 0
if (!this.uiContext) {
console.info("no uiContext, keyframe failed");
return;
}
// 设置关键帧动画整体播放3次
this.uiContext.keyframeAnimateTo({ iterations: -1 }, [
{
duration: 100, event: () => {
this.valueInfo = 0
}
},
{
duration: 1000, event: () => {
this.valueInfo = 100;
}
}
]);
} else if (TouchType.Down == event.type) {
console.log("message == down");
this.nLength = 50
this.fontSizeInfo01 = 7
this.fontSizeInfo02 = 10
this.fontSizeInfo03 = 18
this.valueInfo = 0
++this.count
if (!this.uiContext) {
console.info("no uiContext, keyframe failed");
return;
}
// 设置关键帧动画整体播放3次
this.uiContext.keyframeAnimateTo({ iterations: -1 }, [
{
duration: 100, event: () => {
this.valueInfo = 0
}
},
{
duration: 10000, event: () => {
this.valueInfo = 100;
}
}
]);
} else if (TouchType.Cancel == event.type) {
this.nLength = 60
console.log("message == cancel");
}
})
}.width(60)
.height(60)
.justifyContent(FlexAlign.Center)
}
}
.width(60)
.height(60)
.justifyContent(FlexAlign.Center)
.alignItems(HorizontalAlign.Center)
} else {
if (this.fIndex !== index) {
Column() {
Text('N' + item).height(60)
}
.justifyContent(FlexAlign.Center)
.width(60)
.height(60)
.borderRadius(30)
.backgroundColor(Color.Pink)
} else {
Column() {
Text('N' + item).height(60)
}
.width(this.length)
.height(this.length)
.borderRadius(this.length / 2)
.justifyContent(FlexAlign.Center)
.backgroundColor(Color.Pink)
.animation({
duration: 600,
curve: Curve.Friction,
delay: 0,
iterations: -1, // 设置-1表示动画无限循环
playMode: PlayMode.Alternate,
})
}
}
}
.height(120)
.width(80)
.justifyContent(FlexAlign.Center)
.border({ color: Color.Green, width: 2 })
.onClick(() => {
this.isChange = true
if (!this.uiContext) {
console.info("no uiContext, keyframe failed");
return;
}
// 设置关键帧动画整体播放3次
this.uiContext.keyframeAnimateTo({ iterations: -1 }, [
{
duration: 100, event: () => {
this.valueInfo = 0
}
},
{
duration: 10000, event: () => {
this.valueInfo = 100;
}
}
]);
})
Text("点击选中")
.fontColor(this.fIndex === index ? Color.Green : Color.Black)
.id(index.toString())
.fontSize(14)
.fontWeight(700)
.backgroundColor(this.fIndex === index ? Color.Orange : Color.Grey)
.width(70)
.height(20)
.onClick(() => {
this.count = 1
this.fIndex = index
this.isChange = false
if (this.fIndex === index) {
this.length = 60
setTimeout(() => {
this.length = 70
}, 100)
}
console.info("index = " + index + ", fIndex = " + this.fIndex)
})
}
.width(100)
.height(150)
.border({ color: Color.Black, width: 2 })
}
})
}
.width('90%')
.border({ width: 1, color: Color.Black })
.columnsTemplate('repeat(auto-fill, 80)')
.columnsGap(25)
.rowsGap(20)
.height(450)
}
.width('100%')
.height('100%')
}
}

更多关于HarmonyOS 鸿蒙Next点击礼物的动画效果的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对帖子标题“HarmonyOS 鸿蒙Next点击礼物的动画效果”,以下是专业且简洁的回答:

在HarmonyOS鸿蒙系统中实现点击礼物的动画效果,通常涉及动画资源的准备和动画框架的使用。具体步骤如下:

  1. 动画资源准备:首先,需要设计并准备好点击礼物时的动画资源,这可能包括帧动画、属性动画等。这些资源应以图片序列、矢量图或其他可动画化的格式存在。

  2. 动画框架使用:HarmonyOS提供了动画框架,允许开发者定义和播放动画。你需要使用这些API来加载动画资源,并设置动画的触发条件(如点击事件)。

  3. 事件监听与动画触发:为礼物组件设置点击事件监听器。当用户点击礼物时,触发动画播放。

  4. 动画同步与循环:确保动画与用户的交互同步,并根据需要设置动画的循环次数或无限循环。

  5. 性能优化:考虑动画的复杂度和帧率,确保动画流畅且不影响系统性能。

如果在实现过程中遇到具体问题,如动画播放不流畅、触发条件不生效等,请检查动画资源的正确性、API的使用方式以及事件监听的配置。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部