组件演示

screenshot.png

axml

  1. <div class="warpper">
  2. <x-nav-bar showArrow="{{true}}" title="Canvas"></x-nav-bar>
  3. <div class="container">
  4. <div class="flex buttons">
  5. <div class="button" onTap="line">画线</div>
  6. <div class="button" onTap="round">画圆</div>
  7. <div class="button" onTap="drop">画点</div>
  8. <div class="button" onTap="strokeRect">画矩形框</div>
  9. <div class="button" onTap="reac">画填充矩形</div>
  10. <!-- <div class="button" onTap="createLinearGradient">线性渐变</div> -->
  11. <!-- <div class="button" onTap="drawImage">绘制图片</div> -->
  12. <div class="button" onTap="bezierCurveTo">绘制二次曲线</div>
  13. <div class="button" onTap="fillText">文本</div>
  14. <!-- <div class="button" onTap="measureText">获取文本宽度</div> -->
  15. <div class="button" onTap="clear">清除画布</div>
  16. </div>
  17. <!-- <div class="tip">
  18. <div class="flex">measureText(文本宽度):<text class="text">{{measureText}}</text></div>
  19. </div> -->
  20. <div class="canvas-box">
  21. <canvas id="canvasx" class="canvas"></canvas>
  22. </div>
  23. <image mode="scaleToFill" src="{{src}}" />
  24. </div>
  25. </div>

css

.warpper {
  background-color:white;
  width:100%;
  height:100%;
  display:flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}
.container{
  flex: 1;
  color: #999;
  font-size: 16rpx;
  width: 100%;
  line-height: 30rpx;
}
.flex{
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: flex-start;
  flex-wrap: wrap;
}
.buttons{
  padding-left: 20rpx;
  padding-right: 20rpx;
  margin-bottom: 20rpx;
  border-bottom: 1rpx solid darkgoldenrod;
}
.button{
  margin-bottom: 10rpx;
  margin-right: 20rpx;
  padding-left: 10rpx;
  padding-right: 10rpx;
  border-radius: 8rpx;
  background-color: #ccc;
  color: #fff;
}
.tip{
  margin-bottom: 20rpx;
  padding-left: 20rpx;
  padding-right: 20rpx;
  padding-bottom: 20rpx;
  background-color: #25b864;
  color: #fff;
}
.text{
  color: red;
}
.canvas-box{
  border: 1rpx solid red;
  overflow: hidden;
}
.canvas{
  margin-left: 25vw;
  width: 40vw;
  height: 40vh;
}

ts

import { JSON, JSONObject } from "waft-json";
import { console, getDataSource, Page, Props, CanvasContext, MessageEvent, CanvasElement, document, Event, TouchEvent } from "waft";

let _this: Index;
export class Index extends Page {
  constructor(props: Props){
    super(props);
    _this = this;
    // 设置默认的state
    this.setState(getDataSource());

    // 画线
    this.addEventListener('line', () => {
      // 获取canvas对象
      const element = document.querySelector("#canvasx") as CanvasElement;
      const ctx:CanvasContext = element.getContext();      
      ctx.beginPath();
      ctx.setLineWidth(5)
      ctx.moveTo(50, 50)
      ctx.lineTo(50, 150)
      ctx.lineTo(100, 150)
      ctx.lineTo(50, 50)
      ctx.setShadow(4, 4, 4, 'red')
      ctx.stroke()
    })
    // 画圆
    this.addEventListener('round', () => {
      // 获取canvas对象
      const element = document.querySelector("#canvasx") as CanvasElement;
      const ctx:CanvasContext = element.getContext();      
      ctx.beginPath();
      ctx.arc(20, 20, 10, 0, 2 * 3.14)
      ctx.setStrokeStyle('green')
      ctx.stroke()
    })
    // 画点
    this.addEventListener('drop', () => {
      // 获取canvas对象
      const element = document.querySelector("#canvasx") as CanvasElement;
      const ctx:CanvasContext = element.getContext();
      ctx.beginPath();
      ctx.arc(50, 20, 10, 0, 2 * 3.14)
      ctx.setFillStyle('red')

      ctx.fill()
      ctx.draw()
    })
    // 画边框
    this.addEventListener('strokeRect', () => {
      // 获取canvas对象
      const element = document.querySelector("#canvasx") as CanvasElement;
      const ctx:CanvasContext = element.getContext();
      ctx.beginPath()
      ctx.strokeRect(80, 10, 40, 40)
      ctx.setFillStyle('red')
      ctx.fill()
      ctx.draw()
    })
    // 画矩形
    this.addEventListener('reac', () => {
      // 获取canvas对象
      const element = document.querySelector("#canvasx") as CanvasElement;
      const ctx:CanvasContext = element.getContext();
      ctx.beginPath();
      ctx.fillRect(130, 10, 40, 40)
      ctx.setFillStyle('red')
      ctx.fill()
      ctx.draw()
    })
    // 清空画布
    this.addEventListener('clear', () => {
      // 获取canvas对象
      const element = document.querySelector("#canvasx") as CanvasElement;
      const ctx:CanvasContext = element.getContext();
      ctx.beginPath();
      ctx.clearRect(0, 0, 1000, 1000)
    })
    // 绘制图片
    this.addEventListener('drawImage', () => {
      // 获取canvas对象
      const element = document.querySelector("#canvasx") as CanvasElement;
      const ctx:CanvasContext = element.getContext();      
      ctx.beginPath();
      ctx.drawImage(
        'https://img.alicdn.com/tps/TB1z.55OFXXXXcLXXXXXXXXXXXX-560-560.jpg',
        100,
        20,
        300,
        100
      )
      // ctx.arc(50, 50, 10, 0, 2 * 3.14)
      // ctx.createCircularGradient(50, 50, 10)
      // ctx.addColorStop(0, 'green')
      // ctx.addColorStop(180, 'red')
      // ctx.fill()
      ctx.draw()
      // ctx.fillRect(20,20,150,100);
    })
    // 二次曲线
    this.addEventListener('bezierCurveTo', () => {
      // 获取canvas对象
      const element = document.querySelector("#canvasx") as CanvasElement;
      const ctx:CanvasContext = element.getContext();      
      ctx.beginPath();
      ctx.moveTo(20, 20);
      ctx.bezierCurveTo(20, 100, 200, 100, 200, 20);
      ctx.setStrokeStyle('black');
      ctx.stroke();
      // ctx.fillRect(20,20,150,100);
    })
    // 文本
    this.addEventListener('fillText', () => {
      // 获取canvas对象
      const element = document.querySelector("#canvasx") as CanvasElement;
      const ctx:CanvasContext = element.getContext();      
      ctx.beginPath();
      ctx.fillText('测试文本', 70, 20);
      ctx.setFontSize(50);
      ctx.setTextAlign('center');
      ctx.setTextBaseline('bottom');
      ctx.draw();
    })
    // 文本宽度
    this.addEventListener('measureText', () => {
      // 获取canvas对象
      const element = document.querySelector("#canvasx") as CanvasElement;
      const ctx:CanvasContext = element.getContext();      
      console.log('===measureText1====')
      ctx.measureText('测试文本', (target) => {
        const detail = target.getObject('detail')
        console.log(target.toString()+'===target1====')
        const newState = new JSONObject;
        newState.set('measureText', detail.toString())
        _this.setState(newState)
      })
    })
  }
  onShow(): void{
    // 页面显示
    console.log('page onShow');
  }
  onLoad(query: JSONObject): void{
    // 页面加载后
    console.log('page onLoad:' + JSON.stringify(query));
  }
  onMessage(event: MessageEvent): void{
    // 信息推送更新
    console.log('page onMessage:' + JSON.stringify(event.data));
  }
}

属性getContext

获取Canvas上下文

import { CanvasElement, CanvasContext } from 'waft';
// 获取canvas对象
const element = document.querySelector("#canvasx") as CanvasElement;
const ctx:CanvasContext = element.getContext();

API

名称 描述
CanvasContext.addColorStop 创建一个圆形的渐变色。
CanvasContext.arc 画一条弧线。
CanvasContext.beginPath 开始创建一个路径,需要调用 fill
或者 stroke
才会使用路径进行填充或描边。
CanvasContext.bezierCurveTo 创建三次方贝塞尔曲线路径。
CanvasContext.clearRect 清除画布上在该矩形区域内的内容。
CanvasContext.clip 将当前创建的路径设置为当前剪切路径。
CanvasContext.closePath 关闭一个路径。
CanvasContext.createCircularGradient 创建一个圆形的渐变色。起点在圆心,终点在圆环。
CanvasContext.createLinearGradient 创建一个线性的渐变色。
CanvasContext.draw 将之前在绘图上下文中的描述(路径、变形、样式)画到 canvas 中。
CanvasContext.drawImage 绘制图像,图像保持原始尺寸。
CanvasContext.fill 对当前路径中的内容进行填充。
CanvasContext.fillRect 填充矩形。
CanvasContext.fillText 在画布上绘制被填充的文本。
CanvasContext.getImageData 获取 canvas 区域隐含的像素数据。
CanvasContext.lineTo 增加一个新点,然后创建一条从上次指定点到目标点的线。
CanvasContext.measureText 测量文本尺寸信息,目前仅返回文本宽度。同步接口。
CanvasContext.moveTo 把路径移动到画布中的指定点,不创建线条。
CanvasContext.putImageData 将像素数据绘制到画布。
CanvasContext.quadraticCurveTo 创建二次贝塞尔曲线路径。
CanvasContext.rect 创建二次贝塞尔曲线路径。
CanvasContext.restore 恢复之前保存的绘图上下文。
CanvasContext.rotate 以原点为中心,原点可以用 translate
方法修改。顺时针旋转当前坐标轴。多次调用rotate
,旋转的角度会叠加。
CanvasContext.save 保存当前的绘图上下文。
CanvasContext.scale 在调用scale
方法后,之后创建的路径其横纵坐标会被缩放。多次调用scale
,倍数会相乘。
CanvasContext.setFillStyle 设置填充色。
CanvasContext.setFontSize 设置字体大小。
CanvasContext.setGlobalAlpha 设置全局画笔透明度。
CanvasContext.setLineCap 设置线条的端点样式。
CanvasContext.setLineDash 设置虚线的样式。
CanvasContext.setLineJoin 设置线条的交点样式。
CanvasContext.setLineWidth 设置线条的宽度。
CanvasContext.setMiterLimit 设置最大斜接长度。
CanvasContext.setShadow 设置阴影样式。
CanvasContext.setStrokeStyle 设置边框颜色。
CanvasContext.setTextAlign Canvas 2D API 描述绘制文本时,文本的对齐方式的属性。
CanvasContext.setTextBaseline Canvas 2D API 描述绘制文本时,当前文本基线的属性。
CanvasContext.setTransform 使用单位矩阵重新设置(覆盖)当前的变换并调用变换的方法,此变换由方法的变量进行描述。
CanvasContext.stroke 画出当前路径的边框。默认 black
CanvasContext.strokeRect 画一个矩形(非填充)。
CanvasContext.toDataURL 获取画布指定区域的 data URL数据。
CanvasContext.toTempFilePath 把当前画布的内容导出生成图片,并返回文件路径。
CanvasContext.transform 使用矩阵多次叠加当前变换的方法,矩阵由方法的参数进行描述。可以缩放、旋转、移动和倾斜上下文。
CanvasContext.translate 对当前坐标系的原点(0, 0)进行变换,默认的坐标系原点为页面左上角。