1. 程式人生 > >微信小程式---通過二次貝塞爾曲線畫波浪

微信小程式---通過二次貝塞爾曲線畫波浪

這兩週做一個新的專案,人員比較緊張,除了需求和UI,前端後端一個人來幹。

在專案需求確定後,UI隔了幾天設計出了UI介面,拿到UI效果圖後見有一個介面有波浪效果的我當時就蒙圈了,這都啥玩意啊?轉念想到了最近在IT圈挺火的那個事件:產品要求安卓程式設計師實現根據使用者手機殼顏色自動更換APP主題的需求後,頓時覺得畫個波浪這個壓根就不是事啊。

二次貝塞爾曲線

在微信官方的二次貝塞爾曲線畫法連線如下:

畫波浪

思路:

在螢幕左邊畫一個波,然後讓它一直向螢幕右邊平移過去。其X的值由負數變為正數依次增大;然後一直重複此操作。

我畫出來的波浪如下(感覺還是有那麼一點波浪的感覺):

介面程式碼為(index.wxml):

<view class="page-body">
  <view class="page-body-wrapper">
    <canvas canvas-id="myCanvas3" class="canvas3"></canvas>
  </view>
</view>

JS程式碼為(index.js):

Page({
  onReady: function() {
    this.position = {
        x: 150,
        y: 150,
        vx: 2,
        vy: 2
      },
      this.obj = {
        offset: 0,
        baseLine: 40,
        direction: 1,
        waveDirection: 1
      },
      // var offset = 5
      this.drawQuadraticCurve3()
    this.interval = setInterval(this.drawQuadraticCurve3, 1)
    console.log(">>>>>>>>>" + this.obj.offset)
  },
  /**
   * 畫大波浪
   */
  drawQuadraticCurve3: function() {
    var obj = this.obj
    var startX = 20,
      itemWidth = 100,
      offset = obj.offset,
      baseLine = obj.baseLine,
      waveHeight = 10,
      direction = obj.direction,
      waveDirection = obj.waveDirection

    const ctx = wx.createCanvasContext('myCanvas3')


    function getWaveHeigh(i) {
      if (i % 2 == 0) {
        // return baseLine + waveHeight
      }
      return baseLine - waveHeight
    }
    ctx.beginPath()
    ctx.moveTo(-itemWidth * 6, baseLine)
    ctx.setFillStyle('#4BF6EE')
    for (var i = -6; i < 5; i++) {
      startX = i * itemWidth;
      var currentX = startX + (itemWidth / 2) + offset
      var currentY = getWaveHeigh(i)
      var currentEndX = startX + itemWidth + offset
      ctx.quadraticCurveTo(currentEndX - 10,
        currentY, currentEndX, baseLine)
      ctx.stroke()
    }
    //填充海水
    ctx.lineTo(0, 2000)
    ctx.setFillStyle('#4BF6EE')
    ctx.fill()

    ctx.draw()


    if (obj.waveDirection == 1) {
      obj.offset = obj.offset + 1
    } else if (obj.waveDirection == -1) {
      obj.offset = obj.offset - 1
    }
    if (obj.offset == 400) {
      obj.offset = 0
    }
    if (obj.offset == 50 || obj.offset == 1) {
      // obj.waveDirection = obj.waveDirection * -1
    }


    // if (direction == 1) {
    //   obj.baseLine = obj.baseLine + 1
    // } else if (direction == -1) {
    //   obj.baseLine = obj.baseLine - 1
    // }
    if (obj.baseLine >= 50 || obj.baseLine <= 40) {
      console.log("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
      //obj.direction = (obj.direction * -1)
    }
  },
  onUnload: function() {
    clearInterval(this.interval)
  }
})