组件演示
axml
<div class="warpper">
<x-nav-bar showArrow="{{true}}" title="Canvas"></x-nav-bar>
<div class="container">
<div class="flex buttons">
<div class="button" onTap="line">画线</div>
<div class="button" onTap="round">画圆</div>
<div class="button" onTap="drop">画点</div>
<div class="button" onTap="strokeRect">画矩形框</div>
<div class="button" onTap="reac">画填充矩形</div>
<!-- <div class="button" onTap="createLinearGradient">线性渐变</div> -->
<!-- <div class="button" onTap="drawImage">绘制图片</div> -->
<div class="button" onTap="bezierCurveTo">绘制二次曲线</div>
<div class="button" onTap="fillText">文本</div>
<!-- <div class="button" onTap="measureText">获取文本宽度</div> -->
<div class="button" onTap="clear">清除画布</div>
</div>
<!-- <div class="tip">
<div class="flex">measureText(文本宽度):<text class="text">{{measureText}}</text></div>
</div> -->
<div class="canvas-box">
<canvas id="canvasx" class="canvas"></canvas>
</div>
<image mode="scaleToFill" src="{{src}}" />
</div>
</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)进行变换,默认的坐标系原点为页面左上角。 |