element-draw.uvue 10.0 KB
Newer Older
张磊 已提交
1
<template>
张磊 已提交
2 3 4 5
  <!-- #ifdef APP -->
  <scroll-view style="flex: 1">
  <!-- #endif -->
    <view>
6 7 8 9 10 11 12 13
      <view id="draw-text-view" style="width: 750rpx;height: 550rpx; background-color: lightgray;margin: 30rpx 0rpx;"></view>
      <view id="draw-line-view" style="width: 750rpx;height: 550rpx; background-color: lightgray;margin: 30rpx 0rpx;"></view>
      <view id="draw-circle-view" style="width: 750rpx;height: 550rpx; background-color: lightgray;margin: 30rpx 0rpx;"></view>
      <view id="draw-dash-line" style="width: 750rpx;height: 550rpx; background-color: lightgray;margin: 30rpx 0rpx;"></view>
      <view id="draw-house" style="width: 750rpx;height: 550rpx; background-color: lightgray;margin: 30rpx 0rpx;"></view>
      <view id="draw-style" style="width: 750rpx;height: 550rpx; background-color: lightgray;margin: 30rpx 0rpx;"></view>
      <view id="draw-odd" style="width: 750rpx;height: 550rpx; background-color: lightgray;margin: 30rpx 0rpx;"></view>
      <view id="draw-arcto" style="width: 750rpx;height: 550rpx; background-color: lightgray;margin: 30rpx 0rpx;"></view>
张磊 已提交
14 15 16 17
    </view>
  <!-- #ifdef APP -->
  </scroll-view>
  <!-- #endif -->
张磊 已提交
18 19 20
</template>

<script>
张磊 已提交
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
  var y = 160
  export default {
    data() {
      return {
        texts: [
          'HBuilderX,轻巧、极速,极客编辑器',
          'uni-app x,终极跨平台方案',
          'uniCloud,js serverless云服务',
          'uts,大一统语言',
          'uniMPSdk,让你的App具备小程序能力',
          'uni-admin,开源、现成的全端管理后台',
          'uni-id,开源、全端的账户中心',
          'uni-pay,开源、云端一体、全平台的支付',
          'uni-ai,聚合ai能力',
          'uni-cms,开源、云端一体、全平台的内容管理平台',
          'uni-im,开源、云端一体、全平台的im即时消息',
          'uni统计,开源、完善、全平台的统计报表',
          '......'
        ] as string[]
      }
    },
    onShow() {
    },
张磊 已提交
44

张磊 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
    onReady() {
      this.drawText()
      this.drawLines()
      this.drawCircles()
      this.drawStar()
      this.drawhouse()
      this.drawPoint()
      this.drawRect()
      this.drawArcTo()
    },
    onUnload() {
      y = 160
    },
    methods: {
      drawText() {
60 61
        let element = uni.getElementById('draw-text-view')
        let ctx = element!.getDrawableContext()
张磊 已提交
62
        let width = element!.getBoundingClientRect().width
张磊 已提交
63
        ctx!.reset()
张磊 已提交
64 65
        ctx!.font = "15px"
        ctx!.textAlign = "center"
张磊 已提交
66 67 68
        for (var i = 0; i < this.texts.length; i++) {
          let value = this.texts[i]
          if (i % 2 == 0) {
张磊 已提交
69
            ctx!.fillText(value, width / 2, (20 * (i + 1)))
张磊 已提交
70
          } else {
张磊 已提交
71
            ctx!.strokeText(value, width / 2, (20 * (i + 1)))
张磊 已提交
72 73
          }
        }
张磊 已提交
74
        ctx!.update()
张磊 已提交
75 76
      },
      drawLines() {
77
        let ctx = uni.getElementById('draw-line-view')!.getDrawableContext()
张磊 已提交
78
        ctx!.reset()
张磊 已提交
79
        ctx!.lineWidth = 10;
张磊 已提交
80

张磊 已提交
81
        ["round", "bevel", "miter"].forEach((join, i) => {
张磊 已提交
82 83 84 85 86 87 88 89
          ctx!.lineJoin = join;
          ctx!.beginPath();
          ctx!.moveTo(5, 10 + i * 40);
          ctx!.lineTo(50, 50 + i * 40);
          ctx!.lineTo(90, 10 + i * 40);
          ctx!.lineTo(130, 50 + i * 40);
          ctx!.lineTo(170, 10 + i * 40);
          ctx!.stroke();
张磊 已提交
90
        });
张磊 已提交
91
        ctx!.lineWidth = 1
张磊 已提交
92
        var space = 170
张磊 已提交
93 94 95 96 97 98 99
        ctx!.strokeStyle = '#09f';
        ctx!.beginPath();
        ctx!.moveTo(10 + space, 10);
        ctx!.lineTo(140 + space, 10);
        ctx!.moveTo(10 + space, 140);
        ctx!.lineTo(140 + space, 140);
        ctx!.stroke();
张磊 已提交
100
        // Draw lines
张磊 已提交
101
        ctx!.strokeStyle = 'black';
张磊 已提交
102
        ['butt', 'round', 'square'].forEach((lineCap, i) => {
张磊 已提交
103 104 105 106 107 108
          ctx!.lineWidth = 15;
          ctx!.lineCap = lineCap;
          ctx!.beginPath();
          ctx!.moveTo(25 + space + i * 50, 10);
          ctx!.lineTo(25 + space + i * 50, 140);
          ctx!.stroke();
张磊 已提交
109
        });
张磊 已提交
110 111 112 113 114 115 116 117 118 119 120 121
        ctx!.lineWidth = 1;
        this.drawDashedLine([], ctx!);
        this.drawDashedLine([2, 2], ctx!);
        this.drawDashedLine([10, 10], ctx!);
        this.drawDashedLine([20, 5], ctx!);
        this.drawDashedLine([15, 3, 3, 3], ctx!);
        this.drawDashedLine([20, 3, 3, 3, 3, 3, 3, 3], ctx!);
        ctx!.lineDashOffset = 18;
        this.drawDashedLine([12, 3, 3], ctx!);
        ctx!.lineDashOffset = 0
        ctx!.setLineDash([0])
        ctx!.update()
张磊 已提交
122 123 124 125 126 127 128 129 130 131
      },
      drawDashedLine(pattern : Array<number>, ctx : DrawableContext) {
        ctx.beginPath();
        ctx.setLineDash(pattern);
        ctx.moveTo(0, y);
        ctx.lineTo(300, y);
        ctx.stroke();
        y += 15;
      },
      drawCircles() {
132
        let ctx = uni.getElementById('draw-circle-view')!.getDrawableContext()
张磊 已提交
133
        ctx!.reset()
张磊 已提交
134 135 136
        // Draw shapes
        for (var i = 0; i < 4; i++) {
          for (var j = 0; j < 3; j++) {
张磊 已提交
137
            ctx!.beginPath();
张磊 已提交
138 139 140 141 142 143
            var x = 25 + j * 50;               // x coordinate
            var y = 25 + i * 50;               // y coordinate
            var radius = 20;                    // Arc radius
            var startAngle = 0;                     // Starting point on circle
            var endAngle = Math.PI + (Math.PI * j) / 2; // End point on circle
            var clockwise = i % 2 == 0 ? false : true; // clockwise or anticlockwise
张磊 已提交
144

张磊 已提交
145
            ctx!.arc(x, y, radius, startAngle, endAngle, clockwise);
张磊 已提交
146

张磊 已提交
147
            if (i > 1) {
张磊 已提交
148
              ctx!.fill();
张磊 已提交
149
            } else {
张磊 已提交
150
              ctx!.stroke();
张磊 已提交
151 152 153
            }
          }
        }
张磊 已提交
154
        ctx!.update()
张磊 已提交
155
      },
张磊 已提交
156

张磊 已提交
157
      drawStar() {
158
        let ctx = uni.getElementById('draw-dash-line')!.getDrawableContext()
张磊 已提交
159
        ctx!.reset()
张磊 已提交
160
        ctx!.beginPath();
张磊 已提交
161 162 163 164 165 166 167 168 169 170 171
        var horn = 5; // 画5个角
        var angle = 360 / horn; // 五个角的度数
        // 两个圆的半径
        var R = 50;
        var r = 20;
        // 坐标
        var x = 100;
        var y = 100;
        for (var i = 0; i < horn; i++) {
          // 角度转弧度:角度/180*Math.PI
          // 外圆顶点坐标
张磊 已提交
172
          ctx!.lineTo(Math.cos((18 + i * angle) / 180.0 * Math.PI) * R + x, -Math.sin((18 + i * angle) / 180.0 * Math.PI) * R + y);
张磊 已提交
173
          // 內圆顶点坐标
张磊 已提交
174
          ctx!.lineTo(Math.cos((54 + i * angle) / 180.0 * Math.PI) * r + x, -Math.sin((54 + i * angle) / 180.0 * Math.PI) * r + y);
张磊 已提交
175 176
        }
        // closePath:关闭路径,将路径的终点与起点相连
张磊 已提交
177 178 179 180 181 182
        ctx!.closePath();
        ctx!.lineWidth = 3;
        ctx!.fillStyle = '#E4EF00';
        ctx!.strokeStyle = "red";
        ctx!.fill();
        ctx!.stroke();
张磊 已提交
183

张磊 已提交
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
        ctx!.lineWidth = 10;
        ctx!.beginPath()
        ctx!.moveTo(170, 100)
        ctx!.lineTo(255, 15)
        ctx!.lineTo(340, 100)
        ctx!.closePath()
        ctx!.fill()
        ctx!.strokeStyle = "blue"
        ctx!.stroke()
        ctx!.beginPath()
        ctx!.moveTo(170, 145)
        ctx!.lineTo(255, 45)
        ctx!.lineTo(340, 145)
        ctx!.closePath()
        ctx!.fill()
        ctx!.strokeStyle = "gray"
        ctx!.stroke()
张磊 已提交
201
        // 未设置beginPath,导致上下表现一致,与前端一致
张磊 已提交
202 203 204 205 206 207 208 209 210
        ctx!.moveTo(170, 190)
        ctx!.lineTo(255, 90)
        ctx!.lineTo(340, 190)
        ctx!.closePath()
        ctx!.fillStyle = "orange"
        ctx!.fill()
        ctx!.strokeStyle = "khaki"
        ctx!.stroke()
        ctx!.update()
张磊 已提交
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
      },
      hex(num : number) : string {
        if (num == 0) {
          return "00"
        }
        let hexChars = "0123456789ABCDEF";
        let result = "";
        while (num > 0) {
          let remainder : Int = num.toInt() % 16;
          result = hexChars[remainder] + result;
          num = Math.floor(num.toInt() / 16);
        }
        if (result.length == 1) {
          return "0" + result
        }
        return result
      },
      drawhouse() {
229
        let ctx = uni.getElementById('draw-house')!.getDrawableContext()
张磊 已提交
230
        ctx!.reset()
张磊 已提交
231
        ctx!.lineWidth = 10;
张磊 已提交
232

张磊 已提交
233
        // Wall
张磊 已提交
234
        ctx!.strokeRect(75, 140, 150, 110);
张磊 已提交
235

张磊 已提交
236
        // Door
张磊 已提交
237
        ctx!.fillRect(130, 190, 40, 60);
张磊 已提交
238

张磊 已提交
239
        // Roof
张磊 已提交
240 241 242 243 244 245 246
        ctx!.beginPath();
        ctx!.moveTo(50, 140);
        ctx!.lineTo(150, 60);
        ctx!.lineTo(250, 140);
        ctx!.closePath();
        ctx!.stroke();
        ctx!.update()
张磊 已提交
247 248
      },
      drawPoint() {
249
        let ctx = uni.getElementById('draw-style')!.getDrawableContext()
张磊 已提交
250
        ctx!.reset()
张磊 已提交
251 252
        for (let i = 0; i < 6; i++) {
          for (let j = 0; j < 6; j++) {
张磊 已提交
253 254 255 256
            ctx!.strokeStyle = `rgb(0,${Math.floor(255 - 42.5 * i)},${Math.floor(255 - 42.5 * j)})`;
            ctx!.beginPath();
            ctx!.arc(12.5 + j * 25, 12.5 + i * 25, 10, 0, Math.PI * 2, true);
            ctx!.stroke();
张磊 已提交
257 258 259 260
          }
        }
        for (let i = 0; i < 6; i++) {
          for (let j = 0; j < 6; j++) {
张磊 已提交
261 262
            ctx!.fillStyle = `rgb(${Math.floor(255 - 42.5 * i)},${Math.floor(255 - 42.5 * j)},0)`;
            ctx!.fillRect(180 + j * 25, i * 25, 25, 25);
张磊 已提交
263 264
          }
        }
张磊 已提交
265
        ctx!.update()
张磊 已提交
266 267
      },
      drawRect() {
268
        let ctx = uni.getElementById('draw-odd')!.getDrawableContext()
张磊 已提交
269
        ctx!.reset()
张磊 已提交
270
        // Create path
张磊 已提交
271 272 273 274 275 276 277
        ctx!.moveTo(30, 90);
        ctx!.lineTo(110, 20);
        ctx!.lineTo(240, 130);
        ctx!.lineTo(60, 130);
        ctx!.lineTo(190, 20);
        ctx!.lineTo(270, 90);
        ctx!.closePath();
张磊 已提交
278

张磊 已提交
279
        // Fill path
张磊 已提交
280 281 282
        ctx!.fillStyle = "green";
        ctx!.fill("evenodd");
        ctx!.update()
张磊 已提交
283

张磊 已提交
284 285
      },
      drawArcTo() {
286
        let ctx = uni.getElementById('draw-arcto')!.getDrawableContext()
张磊 已提交
287
        ctx!.reset()
张磊 已提交
288 289 290 291
        ctx!.beginPath();
        ctx!.moveTo(50, 20);
        ctx!.bezierCurveTo(230, 30, 150, 60, 50, 100);
        ctx!.stroke();
张磊 已提交
292

张磊 已提交
293
        ctx!.fillStyle = "blue";
张磊 已提交
294
        // start point
张磊 已提交
295
        ctx!.fillRect(50, 20, 10, 10);
张磊 已提交
296
        // end point
张磊 已提交
297
        ctx!.fillRect(50, 100, 10, 10);
张磊 已提交
298

张磊 已提交
299
        ctx!.fillStyle = "red";
张磊 已提交
300
        // control point one
张磊 已提交
301
        ctx!.fillRect(230, 30, 10, 10);
张磊 已提交
302
        // control point two
张磊 已提交
303 304
        ctx!.fillRect(150, 70, 10, 10);
        ctx!.update()
张磊 已提交
305 306 307
      }
    }
  }
张磊 已提交
308 309 310 311
</script>

<style>

张磊 已提交
312
</style>