HarmonyOS 如何实现WaveView动画?

语音搜索的时候,按住语音按钮,下面的背景有水波纹的动画效果。

HarmonyOS
2024-09-27 11:19:15
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang
@Entry  
@Component  
struct Page240423185507109 {  
  private settings: RenderingContextSettings = new RenderingContextSettings(true)  
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)  
  waveSpeed: number = 0.03  
  phase: number = 0  
  
  drawWave() {  
    this.context?.clearRect(0, 0, this.context.width, this.context.height)  
  
    this.context?.beginPath()  
    for (let x = 0; x <= this.context.width; x += 10) {  
      const y = this.context.height / 2 + Math.sin(x * 0.01 + this.phase) * 20  
      this.context?.lineTo(x, y)  
    }  
    this.context?.lineTo(this.context.width, this.context.height)  
    this.context?.lineTo(0, this.context.height)  
    this.context?.closePath()  
  
    this.context.fillStyle = '#30007bff'  
    this.context?.fill()  
  
    this.context?.beginPath()  
    for (let x = 0; x <= this.context.width; x += 10) {  
      const y = this.context.height / 2 + Math.sin(x * 0.02 + this.phase) * 10  
      this.context?.lineTo(x, y)  
    }  
    this.context?.lineTo(this.context.width, this.context.height)  
    this.context?.lineTo(0, this.context.height)  
    this.context?.closePath()  
  
    this.context.fillStyle = '#50007bff'  
    this.context?.fill()  
  
    this.context?.beginPath()  
    for (let x = 0; x <= this.context.width; x += 10) {  
      const y = this.context.height / 2 + Math.sin(x * 0.015 + this.phase) * 30  
      this.context?.lineTo(x, y)  
    }  
    this.context?.lineTo(this.context.width, this.context.height)  
    this.context?.lineTo(0, this.context.height)  
    this.context?.closePath()  
  
    this.context.fillStyle = '#20007bff'  
    this.context?.fill()  
  
    this.phase += this.waveSpeed  
  }  
  
  build() {  
    Column() {  
      Canvas(this.context)  
        .width(200)  
        .height(100)  
        .backgroundColor(Color.Pink)  
        .onReady(() => {  
          setInterval(this.drawWave.bind(this), 20)  
        })  
    }.width("100%").height("100%").justifyContent(FlexAlign.Center)  
  }  
}

具体实现逻辑:

this.context?.beginPath()  
for (let x = 0; x <= this.context.width; x += 10) {  
  const y = this.context.height / 2 + Math.sin(x * 0.01 + this.phase) * 20  
  this.context?.lineTo(x, y)  
}  
this.context?.lineTo(this.context.width, this.context.height)  
this.context?.lineTo(0, this.context.height)  
this.context?.closePath()  
  
this.context.fillStyle = '#30007bff'  
this.context?.fill()

这一段代码,就是一条水波纹。

分享
微博
QQ
微信
回复
2024-09-27 17:06:56
相关问题
HarmonyOS 如何实现RippleView动画
231浏览 • 1回复 待解决
HarmonyOS 如何实现旋转动画
326浏览 • 1回复 待解决
HarmonyOS如何实现动态缩放动画
435浏览 • 1回复 待解决
HarmonyOS 如何实现音频声浪动画
478浏览 • 1回复 待解决
属性动画如何实现宽高动画效果
1905浏览 • 1回复 待解决
如何实现动画转场效果
771浏览 • 1回复 待解决
如何应用属性动画实现宽高的动画
302浏览 • 1回复 待解决
HarmonyOS 如何实现放大缩小的动画
252浏览 • 1回复 待解决
鸿蒙如何实现动画值变化
9362浏览 • 1回复 待解决
文字动画效果如何实现
1841浏览 • 0回复 待解决
求教ArkUI如何实现组合动画
5447浏览 • 1回复 待解决
HarmonyOS 怎样实现开屏动画或图片?
259浏览 • 1回复 待解决
如何实现自定义应用入场动画
714浏览 • 1回复 待解决
在 ArkUl中如何实现动画效果?
37浏览 • 0回复 待解决
如何实现list的折叠动画效果
404浏览 • 1回复 待解决
swiper组件如何实现自定义切换动画
626浏览 • 1回复 待解决
如何实现组件水波纹动画案例
1000浏览 • 1回复 待解决
如何实现一个带动画的弹窗?
413浏览 • 1回复 待解决
如何实现从底部缓慢上升的弹窗动画
1828浏览 • 1回复 待解决
HarmonyOS 动画中途如何终止?
181浏览 • 1回复 待解决