|
@@ -0,0 +1,360 @@
|
|
|
+<template>
|
|
|
+ <multi-color-background>
|
|
|
+ <h1 class="title">手绘签名</h1>
|
|
|
+ <div class="inner draw" >
|
|
|
+ <div class="canvas-container" @mousemove="beginPath($event)">
|
|
|
+ <canvas
|
|
|
+ id="canvas"
|
|
|
+ class="fl"
|
|
|
+ :width="canvasWidth"
|
|
|
+ :height="canvasHeight"
|
|
|
+ @mousedown="canvasDown($event)"
|
|
|
+ @mouseup="canvasUp($event)"
|
|
|
+ @mousemove="canvasMove($event)"
|
|
|
+ @touchstart="canvasDown($event)"
|
|
|
+ @touchend="canvasUp($event)"
|
|
|
+ @touchmove="canvasMove($event)"
|
|
|
+ >
|
|
|
+ </canvas>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="control">
|
|
|
+ <!--画笔颜色-->
|
|
|
+ <div class="canvas-color clearfix">
|
|
|
+ <ul>
|
|
|
+ <li
|
|
|
+ v-for="item in colors"
|
|
|
+ class="color-shower"
|
|
|
+ :class="{'active':config.lineColor === item}"
|
|
|
+ :style="{ background: item }"
|
|
|
+ @click="setColor(item)"
|
|
|
+ ></li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!--操作-->
|
|
|
+ <div class="canvas-control clearfix">
|
|
|
+ <button class="go-prev action-button" @click="controlCanvas('prev')"><-</button>
|
|
|
+ <button class="go-next action-button" @click="controlCanvas('next')">-></button>
|
|
|
+ </div>
|
|
|
+ <!-- 生成图像-->
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ </div>
|
|
|
+ <button class="draw-image" @click="getImage()">预览</button>
|
|
|
+ <!--存放图片-->
|
|
|
+ </div>
|
|
|
+ </multi-color-background>
|
|
|
+</template>
|
|
|
+<script>
|
|
|
+ import MultiColorBackground from "../components/multiColorBackground";
|
|
|
+ export default {
|
|
|
+ components: {MultiColorBackground},
|
|
|
+ data () {
|
|
|
+ return {
|
|
|
+ colors: ['#333333','#1491e2','#df4848'],
|
|
|
+ context: {},
|
|
|
+ imgUrl: [],
|
|
|
+ canvasMoveUse: true,
|
|
|
+ // 存储当前表面状态数组-上一步
|
|
|
+ preDrawAry: [],
|
|
|
+ // 存储当前表面状态数组-下一步
|
|
|
+ nextDrawAry: [],
|
|
|
+ // 中间数组
|
|
|
+ middleAry: [],
|
|
|
+ // 配置参数
|
|
|
+ config: {
|
|
|
+ lineWidth: 1,
|
|
|
+ lineColor: '#333333',
|
|
|
+ shadowBlur: 2
|
|
|
+ },
|
|
|
+ canvasHeight:0,
|
|
|
+ canvasWidth:0
|
|
|
+ }
|
|
|
+ },
|
|
|
+ created () {
|
|
|
+ },
|
|
|
+ mounted () {
|
|
|
+ const canvas = document.querySelector('#canvas')
|
|
|
+ this.canvasHeight=parseFloat(window.getComputedStyle(canvas).getPropertyValue('height'));
|
|
|
+ this.canvasWidth=parseFloat(window.getComputedStyle(canvas).getPropertyValue('width'));
|
|
|
+ this.context = canvas.getContext('2d')
|
|
|
+ this.initDraw()
|
|
|
+ this.setCanvasStyle()
|
|
|
+ // document.querySelector('#footer').classList.add('hide-footer')
|
|
|
+ // document.querySelector('body').classList.add('fix-body')
|
|
|
+ },
|
|
|
+ destroyed () {
|
|
|
+ // document.querySelector('#footer').classList.remove('hide-footer')
|
|
|
+ // document.querySelector('body').classList.remove('fix-body')
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ controls () {
|
|
|
+ return [{
|
|
|
+ title: '上一步',
|
|
|
+ action: 'prev',
|
|
|
+ className: this.preDrawAry.length ? 'active fa fa-reply' : 'fa fa-reply'
|
|
|
+ }, {
|
|
|
+ title: '下一步',
|
|
|
+ action: 'next',
|
|
|
+ className: this.nextDrawAry.length ? 'active fa fa-share' : 'fa fa-share'
|
|
|
+ }, {
|
|
|
+ title: '清除',
|
|
|
+ action: 'clear',
|
|
|
+ className: (this.preDrawAry.length || this.nextDrawAry.length) ? 'active fa fa-trash' : 'fa fa-trash'
|
|
|
+ }]
|
|
|
+ }
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ isPc () {
|
|
|
+ const userAgentInfo = navigator.userAgent
|
|
|
+ const Agents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod']
|
|
|
+ let flag = true
|
|
|
+ for (let v = 0; v < Agents.length; v++) {
|
|
|
+ if (userAgentInfo.indexOf(Agents[v]) > 0) {
|
|
|
+ flag = false
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return flag
|
|
|
+ },
|
|
|
+ removeImg (src) {
|
|
|
+ this.imgUrl = this.imgUrl.filter(item => item !== src)
|
|
|
+ },
|
|
|
+ initDraw () {
|
|
|
+ const preData = this.context.getImageData(0, 0, this.canvasWidth, this.canvasHeight)
|
|
|
+ // 空绘图表面进栈
|
|
|
+ this.middleAry.push(preData)
|
|
|
+ },
|
|
|
+ canvasMove (e) {
|
|
|
+ if (this.canvasMoveUse) {
|
|
|
+ console.log('canvasMove')
|
|
|
+ const t = e.target
|
|
|
+ let canvasX
|
|
|
+ let canvasY
|
|
|
+ if (this.isPc()) {
|
|
|
+ canvasX = e.clientX - t.parentNode.offsetLeft
|
|
|
+ canvasY = e.clientY - t.parentNode.offsetTop
|
|
|
+ } else {
|
|
|
+ canvasX = e.changedTouches[0].clientX - t.parentNode.offsetLeft
|
|
|
+ canvasY = e.changedTouches[0].clientY - t.parentNode.offsetTop
|
|
|
+ }
|
|
|
+ this.context.lineTo(canvasX, canvasY)
|
|
|
+ this.context.stroke()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ beginPath (e) {
|
|
|
+ const canvas = document.querySelector('#canvas')
|
|
|
+ if (e.target !== canvas) {
|
|
|
+ console.log('beginPath')
|
|
|
+ this.context.beginPath()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // mouseup
|
|
|
+ canvasUp (e) {
|
|
|
+ console.log('canvasUp')
|
|
|
+ const preData = this.context.getImageData(0, 0, 600, 400)
|
|
|
+ if (!this.nextDrawAry.length) {
|
|
|
+ // 当前绘图表面进栈
|
|
|
+ this.middleAry.push(preData)
|
|
|
+ } else {
|
|
|
+ this.middleAry = []
|
|
|
+ this.middleAry = this.middleAry.concat(this.preDrawAry)
|
|
|
+ this.middleAry.push(preData)
|
|
|
+ this.nextDrawAry = []
|
|
|
+ }
|
|
|
+ this.canvasMoveUse = false
|
|
|
+ },
|
|
|
+ // mousedown
|
|
|
+ canvasDown (e) {
|
|
|
+ console.log('canvasDown')
|
|
|
+ this.canvasMoveUse = true
|
|
|
+ // client是基于整个页面的坐标
|
|
|
+ // offset是cavas距离顶部以及左边的距离
|
|
|
+ const canvasX = e.clientX - e.target.parentNode.offsetLeft
|
|
|
+ const canvasY = e.clientY - e.target.parentNode.offsetTop
|
|
|
+ this.setCanvasStyle()
|
|
|
+ // 清除子路径
|
|
|
+ this.context.beginPath()
|
|
|
+ this.context.moveTo(canvasX, canvasY)
|
|
|
+ console.log('moveTo', canvasX, canvasY)
|
|
|
+ // 当前绘图表面状态
|
|
|
+ const preData = this.context.getImageData(0, 0, 600, 400)
|
|
|
+ // 当前绘图表面进栈
|
|
|
+ this.preDrawAry.push(preData)
|
|
|
+ },
|
|
|
+ // 设置颜色
|
|
|
+ setColor (color) {
|
|
|
+ // console.log(111)
|
|
|
+ this.config.lineColor = color
|
|
|
+ },
|
|
|
+ // 操作
|
|
|
+ controlCanvas (action) {
|
|
|
+ switch (action) {
|
|
|
+ case 'prev':
|
|
|
+ if (this.preDrawAry.length) {
|
|
|
+ const popData = this.preDrawAry.pop()
|
|
|
+ const midData = this.middleAry[this.preDrawAry.length + 1]
|
|
|
+ this.nextDrawAry.push(midData)
|
|
|
+ this.context.putImageData(popData, 0, 0)
|
|
|
+ }
|
|
|
+ break
|
|
|
+ case 'next':
|
|
|
+ if (this.nextDrawAry.length) {
|
|
|
+ const popData = this.nextDrawAry.pop()
|
|
|
+ const midData = this.middleAry[this.middleAry.length - this.nextDrawAry.length - 2]
|
|
|
+ this.preDrawAry.push(midData)
|
|
|
+ this.context.putImageData(popData, 0, 0)
|
|
|
+ }
|
|
|
+ break
|
|
|
+ case 'clear':
|
|
|
+ this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height)
|
|
|
+ this.preDrawAry = []
|
|
|
+ this.nextDrawAry = []
|
|
|
+ this.middleAry = [this.middleAry[0]]
|
|
|
+ break
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 生成图片
|
|
|
+ getImage () {
|
|
|
+ const canvas = document.querySelector('#canvas')
|
|
|
+ const src = canvas.toDataURL('image/png')
|
|
|
+ this.imgUrl.push(src)
|
|
|
+ console.log(src);
|
|
|
+ },
|
|
|
+ // 设置绘画配置
|
|
|
+ setCanvasStyle () {
|
|
|
+ this.context.lineWidth = this.config.lineWidth
|
|
|
+ this.context.shadowBlur = this.config.shadowBlur
|
|
|
+ this.context.shadowColor = this.config.lineColor
|
|
|
+ this.context.strokeStyle = this.config.lineColor
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+</script>
|
|
|
+<style >
|
|
|
+ .title{
|
|
|
+ color:white;
|
|
|
+ font-size: 0.5rem;
|
|
|
+ margin-top: 0.6rem;
|
|
|
+ }
|
|
|
+ .control{
|
|
|
+
|
|
|
+ width: 100%;
|
|
|
+ margin-top: 0.6rem;
|
|
|
+
|
|
|
+ }
|
|
|
+ .draw-image{
|
|
|
+ width: 100%;
|
|
|
+ height: 1.1rem;
|
|
|
+ border-radius: 0.6rem;
|
|
|
+ border: none;
|
|
|
+ background-color: #60c0ff;
|
|
|
+ color: #fff;
|
|
|
+ font-size: 0.4rem;
|
|
|
+ margin-top: 0.6rem;
|
|
|
+ }
|
|
|
+ .canvas-container{
|
|
|
+ padding: 1px;
|
|
|
+ width: 100%;
|
|
|
+ height: 11.1rem;
|
|
|
+ }
|
|
|
+
|
|
|
+ .inner{
|
|
|
+ margin: 0.4rem 0.4rem 0;
|
|
|
+ width: 9.2rem;
|
|
|
+
|
|
|
+ }
|
|
|
+ .color-shower{
|
|
|
+ width: 0.4rem;
|
|
|
+ height: 0.4rem;
|
|
|
+ border-radius: 0.2rem;
|
|
|
+ float: left;
|
|
|
+ margin-right: 0.6rem;
|
|
|
+ margin-top: 0.1rem;
|
|
|
+ }
|
|
|
+ .color-shower.active{
|
|
|
+ width: 0.6rem;
|
|
|
+ height: 0.6rem;
|
|
|
+ border-radius: 0.3rem;
|
|
|
+ margin-top: 0;
|
|
|
+ }
|
|
|
+ .canvas-color{
|
|
|
+ margin-top: 0.25rem;
|
|
|
+ float: left;
|
|
|
+ width: 50%;
|
|
|
+ }
|
|
|
+ .canvas-control{
|
|
|
+ float: right;
|
|
|
+ width: 50%;
|
|
|
+ text-align: right;
|
|
|
+ }
|
|
|
+ #canvas{
|
|
|
+ width: 100%;
|
|
|
+ /*width: 100%;*/
|
|
|
+ height: 11.1rem;
|
|
|
+ background-color: white;
|
|
|
+ border-radius: 0.1rem;
|
|
|
+ }
|
|
|
+ .action-button{
|
|
|
+ width: 1.1rem;
|
|
|
+ height: 1.1rem;
|
|
|
+ border: none;
|
|
|
+ border-radius: 100%;
|
|
|
+ background-color: #60c0ff;
|
|
|
+ color: white;
|
|
|
+ font-size: 0.4rem;
|
|
|
+ }
|
|
|
+ .go-prev{
|
|
|
+ margin-right: 0.7rem;
|
|
|
+ }
|
|
|
+</style>
|
|
|
+<!--<template>-->
|
|
|
+
|
|
|
+ <!--<multi-color-background top-height="2.7">-->
|
|
|
+ <!--<h1 class="title">手绘签名</h1>-->
|
|
|
+ <!--<div class="main" >-->
|
|
|
+ <!--<canvas class="draw-area" id="draw-area">-->
|
|
|
+
|
|
|
+ <!--</canvas>-->
|
|
|
+ <!--</div>-->
|
|
|
+ <!--</multi-color-background>-->
|
|
|
+
|
|
|
+<!--</template>-->
|
|
|
+
|
|
|
+<!--<script>-->
|
|
|
+ <!--import Draw from '../components/drawing.js';-->
|
|
|
+
|
|
|
+ <!--import MultiColorBackground from "../components/multiColorBackground";-->
|
|
|
+ <!--export default {-->
|
|
|
+ <!--name: "drawSign",-->
|
|
|
+ <!--components: {MultiColorBackground},-->
|
|
|
+ <!--mounted(){-->
|
|
|
+ <!--let draw = new Draw('draw-area')-->
|
|
|
+ <!--}-->
|
|
|
+ <!--}-->
|
|
|
+<!--</script>-->
|
|
|
+
|
|
|
+<!--<style scoped>-->
|
|
|
+ <!--.title{-->
|
|
|
+ <!--color:white;-->
|
|
|
+ <!--font-size: 0.5rem;-->
|
|
|
+ <!--margin-top: 0.6rem;-->
|
|
|
+ <!--}-->
|
|
|
+ <!--.main .input-container{-->
|
|
|
+ <!--background-color: white;-->
|
|
|
+ <!--border: 1px white solid;-->
|
|
|
+ <!--border-radius: 10px;-->
|
|
|
+ <!--}-->
|
|
|
+ <!--.main{-->
|
|
|
+ <!--margin: 0.4rem 0.4rem 0;-->
|
|
|
+
|
|
|
+ <!--}-->
|
|
|
+ <!--.draw-area{-->
|
|
|
+ <!--width: 100%;-->
|
|
|
+ <!--height: 11.1rem;-->
|
|
|
+ <!--background-color: white;-->
|
|
|
+ <!--border-radius: 0.1rem;-->
|
|
|
+ <!--}-->
|
|
|
+<!--</style>-->
|