# Introduction

The plugin renders graphics based on Canvas, which is easy to use and easy to use. Built-in richer basic graphics can greatly improve development efficiency, and on this basis, you can easily expand new graphics.

Click to replay.

Click to expand or collapse
<template>
  <div class="show-animation">
    <canvas class="canvas" ref="canvas" @click="animation" />
  </div>
</template>

<script>
import CRender from '../../CRender'

export default {
  name: 'ShowAnimation',
  data () {
    return {
      render: null,

      playing: false,

      fragment1Ring1: null,
      fragment1Ring2: null,
      fragment1Polyline1: null,
      fragment1Polyline2: null,

      fragment2Ring1: null,
      fragment2Ring2: null,
      fragment2Arc1: null,
      fragment2Arc2: null,
      fragment2Arc3: null,
      fragment2Arc4: null,
      fragment2Ring12: null,
      fragment2Ring22: null,

      fragment3Circle1: null,
      fragment3Circle2: null,

      fragment5Rings: [],
      fragment5Text: null,
      fragment5Polyline1: null,

      color: ['#e86830', '#e83a30', '#e8308c', '#8930e8', '#30c9e8', '#30e8bd', '#e8e230']
    }
  },
  methods: {
    init () {
      const { $refs, animation } = this

      this.render = new CRender($refs['canvas'])

      animation()
    },
    async animation () {
      const { render, playing } = this

      if (playing) return

      this.playing = true

      render.delAllGraph()

      await this.fragment1(render)

      await this.fragment2(render)

      await this.fragment3(render)

      await this.fragment4(render)

      await this.fragment5(render)

      this.playing = false
    },
    fragment1 (render) {
      const [w, h] = render.area

      const fragment1Ring1 = this.fragment1Ring1 = render.add({
        name: 'ring',
        animationCurve: 'easeInOutBack',
        shape: {
          rx: 0,
          ry: h / 2,
          r: 6
        },
        style: {
          stroke: '#eeca54',
          lineWidth: 10
        }
      })

      const fragment1Ring2 = this.fragment1Ring2 = render.add({
        name: 'ring',
        animationCurve: 'easeInOutBack',
        shape: {
          rx: w,
          ry: h / 2,
          r: 6
        },
        style: {
          stroke: '#eeca54',
          lineWidth: 10
        }
      })

      const fragment1Polyline1 = this.fragment1Polyline1 = render.add({
        name: 'polyline',
        animationCurve: 'easeInOutBack',
        shape: {
          points: [
            [-150, h / 2],
            [0, h / 2]
          ]
        },
        style: {
          stroke: '#eeca54',
          lineWidth: 1
        }
      })

      const fragment1Polyline2 = this.fragment1Polyline2 = render.add({
        name: 'polyline',
        animationCurve: 'easeInOutBack',
        shape: {
          points: [
            [w + 150, h / 2],
            [w, h / 2]
          ]
        },
        style: {
          stroke: '#eeca54',
          lineWidth: 1
        }
      })

      fragment1Ring1.animation('shape', { rx: w / 2 - 80 }, true)
      fragment1Ring2.animation('shape', { rx: w / 2 + 80 }, true)

      fragment1Polyline1.animation('shape', {
        points: [
          [w / 2 - 230, h / 2],
          [w / 2 - 80, h / 2]
        ]
      }, true)

      fragment1Polyline2.animation('shape', {
        points: [
          [w / 2 + 230, h / 2],
          [w / 2 + 80, h / 2]
        ]
      }, true)

      return render.launchAnimation()
    },
    fragment2 (render) {
      const [w, h] = render.area

      this.fragment1Polyline1.animation('shape', {
        points: [
          [w / 2 - 80, h / 2],
          [w / 2 - 80, h / 2]
        ]
      }, true)

      this.fragment1Polyline2.animation('shape', {
        points: [
          [w / 2 + 80, h / 2],
          [w / 2 + 80, h / 2]
        ]
      }, true)

      this.fragment1Ring1.animationFrame = 60
      this.fragment1Ring1.animation('shape', { r: 20 }, true)

      this.fragment1Ring1.animation('style', {
        opacity: 0,
        lineWidth: 0.5
      }, true)

      this.fragment1Ring2.animationFrame = 60
      this.fragment1Ring2.animation('shape', { r: 20 }, true)

      this.fragment1Ring2.animation('style', {
        opacity: 0,
        lineWidth: 0.5
      }, true)

      const fragment2Ring1 = this.fragment2Ring1 = render.add({
        name: 'ring',
        animationCurve: 'easeOutCubic',
        animationFrame: 60,
        shape: {
          rx: w / 2 - 80,
          ry: h / 2,
          r: 6
        },
        style: {
          stroke: '#ee66aa',
          lineWidth: 1
        }
      })

      const fragment2Ring2 = this.fragment2Ring2 = render.add({
        name: 'ring',
        animationCurve: 'easeOutCubic',
        animationFrame: 60,
        shape: {
          rx: w / 2 + 80,
          ry: h / 2,
          r: 6
        },
        style: {
          stroke: '#ee66aa',
          lineWidth: 1
        }
      })

      fragment2Ring1.animation('shape', { r: 30, }, true)
      fragment2Ring1.animation('style', { opacity: 0, }, true)

      fragment2Ring2.animation('shape', { r: 30, }, true)
      fragment2Ring2.animation('style', { opacity: 0, }, true)

      const fragment2Arc1 = this.fragment2Arc1 = render.add({
        name: 'arc',
        animationFrame: 90,
        animationCurve: 'easeOutCubic',
        shape: {
          rx: w / 2,
          ry: h / 2,
          r: 60,
          startAngle: -Math.PI,
          endAngle: -Math.PI + 0.01
        },
        style: {
          stroke: '#30c9e8',
          lineWidth: 2,
          rotate: 0
        }
      })

      const fragment2Arc2 = this.fragment2Arc2 = render.add({
        name: 'arc',
        animationFrame: 90,
        animationCurve: 'easeOutCubic',
        shape: {
          rx: w / 2,
          ry: h / 2,
          r: 60,
          startAngle: 0,
          endAngle: 0.01
        },
        style: {
          stroke: '#30c9e8',
          lineWidth: 2,
          rotate: 0
        }
      })

      const fragment2Arc3 = this.fragment2Arc3 = render.add({
        name: 'arc',
        animationFrame: 90,
        animationCurve: 'easeOutCubic',
        shape: {
          rx: w / 2,
          ry: h / 2,
          r: 100,
          startAngle: -Math.PI,
          endAngle: -Math.PI + 0.01
        },
        style: {
          stroke: '#eeca54',
          lineWidth: 2,
          lineCap: 'round',
          rotate: 0
        }
      })

      const fragment2Arc4 = this.fragment2Arc4 = render.add({
        name: 'arc',
        animationFrame: 90,
        animationCurve: 'easeOutCubic',
        shape: {
          rx: w / 2,
          ry: h / 2,
          r: 100,
          startAngle: 0,
          endAngle: 0.01
        },
        style: {
          stroke: '#eeca54',
          lineWidth: 2,
          lineCap: 'round',
          rotate: 0
        }
      })

      fragment2Arc1.animation('shape', {
        startAngle: -Math.PI,
        endAngle: 0
      }, true)

      fragment2Arc2.animation('shape', {
        startAngle: 0,
        endAngle: Math.PI
      }, true)

      fragment2Arc1.animation('style', { rotate: 360 }, true)

      fragment2Arc2.animation('style', { rotate: 360 }, true)

      fragment2Arc3.animation('shape', {
        startAngle: -Math.PI,
        endAngle: 0,
        r: 20
      }, true)

      fragment2Arc4.animation('shape', {
        startAngle: 0,
        endAngle: Math.PI,
        r: 20
      }, true)

      fragment2Arc3.animation('style', { rotate: 360 }, true)

      fragment2Arc4.animation('style', { rotate: 360 }, true)

      return render.launchAnimation()
    },
    fragment3 (render) {
      const [w, h] = render.area

      const fragment2Ring12 = this.fragment2Ring12 = render.add({
        name: 'ring',
        animationCurve: 'easeOutCubic',
        animationFrame: 60,
        shape: {
          rx: w / 2 - 60,
          ry: h / 2,
          r: 10
        },
        style: {
          stroke: '#c71f16',
          lineWidth: 1
        }
      })

      const fragment2Ring22 = this.fragment2Ring22 = render.add({
        name: 'ring',
        animationCurve: 'easeOutCubic',
        animationFrame: 60,
        shape: {
          rx: w / 2 + 60,
          ry: h / 2,
          r: 10
        },
        style: {
          stroke: '#c71f16',
          lineWidth: 1
        }
      })

      fragment2Ring12.animation('shape', { r: 40 }, true)
      fragment2Ring22.animation('shape', { r: 40 }, true)

      fragment2Ring12.animation('style', { opacity: 0 }, true)
      fragment2Ring22.animation('style', { opacity: 0 }, true)

      this.fragment2Arc1.animation('shape', { r: 100 }, true)
      this.fragment2Arc2.animation('shape', { r: 100 }, true)

      this.fragment2Arc3.animation('shape', { r: 10 }, true)
      this.fragment2Arc4.animation('shape', { r: 10 }, true)

      this.fragment2Arc1.animation('style', { opacity: 0 }, true)
      this.fragment2Arc2.animation('style', { opacity: 0 }, true)

      this.fragment2Arc3.animation('style', { opacity: 0 }, true)
      this.fragment2Arc4.animation('style', { opacity: 0 }, true)

      const fragment3Circle1 = this.fragment3Circle1 = render.add({
        name: 'circle',
        animationFrame: 90,
        animationCurve: 'easeInOutBack',
        shape: {
          rx: 0,
          ry: 0,
          r: 10
        },
        style: {
          fill: '#e9c752',
          graphCenter: [w / 2, h / 2],
          rotate: 30
        },
        setGraphCenter () {}
      })

      const fragment3Circle2 = this.fragment3Circle2 = render.add({
        name: 'circle',
        animationFrame: 90,
        animationCurve: 'easeInOutBack',
        shape: {
          rx: w,
          ry: h,
          r: 10
        },
        style: {
          fill: '#e9c752',
          graphCenter: [w / 2, h / 2]
        },
        setGraphCenter () {}
      })

      fragment3Circle1.animation('shape', { rx: w / 2, ry: h / 2 }, true)
      fragment3Circle2.animation('shape', { rx: w / 2, ry: h / 2 }, true)

      fragment3Circle1.animation('style', { rotate: 360 }, true)
      fragment3Circle2.animation('style', { rotate: 360 }, true)

      return render.launchAnimation()
    },
    fragment4 (render) {
      const [w, h] = render.area

      const randomXArea = [w / 2 - 80, w / 2 + 80]
      const randomYArea = [h / 2 - 80, h / 2 + 80]

      this.fragment3Circle1.attr('style', {
        fill: 'rgba(0, 0, 0, 0)',
        stroke: '#e9c752'
      })

      this.fragment3Circle2.attr('style', {
        fill: 'rgba(0, 0, 0, 0)',
        stroke: '#e9c752'
      })

      this.fragment3Circle1.animation('shape', { r: 50 }, true)
      this.fragment3Circle2.animation('shape', { r: 1 }, true)

      this.fragment3Circle1.animation('style', { opacity: 0 }, true)
      this.fragment3Circle2.animation('style', { opacity: 0 }, true)

      return render.launchAnimation()
    },
    fragment5 (render) {
      const { randomNum, color } = this

      const [w, h] = render.area

      const randomXArea = [w / 2 - 80, w / 2 + 80]
      const randomYArea = [h / 2 - 100, h / 2 + 100]

      this.fragment5Rings = new Array(10).fill(0).map(foo => {
        return render.add({
          name: 'ring',
          animationCurve: 'easeOutCubic',
          animationFrame: 150,
          shape: {
            rx: randomNum(...randomXArea),
            ry: randomNum(...randomYArea),
            r: 1
          },
          style: {
            stroke: color[randomNum(0, 6)]
          }
        })
      })

      this.fragment5Rings.forEach(ring => {
        ring.animation('shape', { r: randomNum(40, 50) }, true)
        ring.animation('style', { opacity: 0 }, true)
      })

      const fragment5Text = this.fragment5Text = render.add({
        name: 'text',
        animationCurve: 'easeOutBack',
        shape: {
          content: 'CRender',
          position: [w / 2, h / 2],
          maxWidth: 200
        },
        style: {
          fill: '#66d7ee',
          fontSize: 50,
          shadowBlur: 0,
          shadowColor: '#66eece',
          scale: [.5, .5],
          rotate: -90,
          opacity: 0
        }
      })

      fragment5Text.animation('style', {
        opacity: 1,
        rotate: 0,
        scale: [1.4, 1.4],
        shadowBlur: 20
      }, true)

      const fragment5Polyline1 = this.fragment1Polyline1 = render.add({
        name: 'polyline',
        animationCurve: 'easeOutBack',
        shape: {
          points: [
            [w / 2, h / 2],
            [w / 2, h / 2]
          ]
        },
        style: {
          lineWidth: 7,
          stroke: '#66d7ee',
          shadowColor: '#66eece',
          shadowBlur: 20
        }
      })

      fragment5Polyline1.animation('shape', {
        points: [
          [w / 2 - 200, h / 2 + 40],
          [w / 2 + 200, h / 2 + 40]
        ]
      }, true)

      return render.launchAnimation()
    },
    randomNum (minNum, maxNum) { 
      switch (arguments.length) { 
        case 1:
          return parseInt(Math.random() * minNum + 1, 10)
        break
        case 2:
          return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10)
        break
      } 
    }
  },
  mounted () {
    this.init()
  }
}
</script>

<style lang="less">
.show-animation {
  height: 300px;
  box-shadow: 0 0 3px #46bd87;

  .canvas {
    width: 100%;
    height: 100%;
    cursor: pointer;
  }
}
</style>

# Characteristics

  • Dynamic

Based on the transition plugin provides dynamic effect support, call the graphical instance's animation method to change its state, CRender will automatically render the graphics state transition animation, animation —— So easy.

Transition

  • Interaction

The built-in basic graphics provide support for functions such as drag, mouseEnter, mouseOut, click, and events.

# Install

  • Install with npm
npm install @jiaminghi/c-render
  • Install with yarn
yarn add @jiaminghi/c-render

# Quick experience

<!--Resources are located on personal servers for experience and testing only, do not use in production environments-->
<!--Debug version-->
<script src="https://unpkg.com/@jiaminghi/c-render@0.4.3/dist/crender.map.js"></script>
<!--Compression version-->
<!-- <script src="https://unpkg.com/@jiaminghi/c-render@0.4.3/dist/crender.min.js"></script> -->
<script>
  const { CRender, extendNewGraph } = window.CRender
  // do something
</script>

# Extend

To extend the new graphics for CRender see Extend