@dickyindra/klinecharts
Version:
Lightweight k-line chart built with html5 canvas
158 lines (144 loc) • 5.03 kB
Markdown
`horizontalRayLine`, `horizontalSegment`, `horizontalStraightLine`, `verticalRayLine`, `verticalSegment`, `verticalStraightLine`, `rayLine`, `segment`, `horizontalSegment`, `priceLine`, `priceChannelLine`, `parallelStraightLine`, `fibonacciLine`
创建一个模板,然后通过`extension.addShapeTemplate` 全局添加,或者通过图表实例方法`addShapeTemplate` 为单个图表实例添加即可。添加到图表即可和内置图形一样去使用。
```javascript
{
// 名称,必须字段,作为图形标记的唯一标识
name: 'xxx',
// 总共需要多少步操作才行绘制完成,必须字段
totalStep: 3,
// 检查鼠标点是否在图形上,是一个回调方法,必须字段
// key 创建数据源的时候给的key
// type 图形类型
// dataSource 图形信息
// eventCoordinate 当前事件坐标
// 需要返回boolean值
checkEventCoordinateOnShape: ({ key, type, dataSource, eventCoordinate }) => {},
// 创建图形数据源,是一个回调方法,必须字段,需要返回图形数据
// step 当前步骤
// points 时间价格点信息
// coordinates 时间价格点对应的坐标轴信息
// viewport 尺寸
// precision 精度信息,包含价格和数量精度
// styles 样式
// xAxis x轴组件
// yAxis y轴组件
// data 外部数据
createShapeDataSource: ({ step, points, coordinates, viewport, precision, styles, xAxis, yAxis, data }) => {},
// 处理在绘制过程中鼠标移动操作,可缺省,鼠标操作绘制过程中触发
// step 当前步骤
// points 图形时间价格点信息
// movePoint 移动对应的点
// xAxis x轴组件
// yAxis y轴组件
performEventMoveForDrawing: ({ step, points, movePoint, xAxis, yAxis }) => {},
// 处理鼠标按住移动操作,可缺省,鼠标按住某个操作点移动过程中触发
// points 图形时间价格点信息
// pressPointIndex 按住点的索引
// pressPoint 按住对应的点
// xAxis x轴组件
// yAxis y轴组件
performEventPressedMove: ({ points, pressPointIndex, pressPoint, xAxis, yAxis }) => {},
// 扩展绘制,可缺省
// ctx 画布上下文
// dataSource 图形数据信息
// styles 图表样式配置
// viewport 尺寸
// precision 精度信息,包含价格和数量精度
// xAxis x轴组件
// yAxis y轴组件
// data 外部数据
drawExtend: ({ ctx, dataSource, styles, viewport, precision, xAxis, yAxis, data }) => {}
}
```
```javascript
{
// key
key: 'key'
// 类型,目前支持'line' | 'text' | 'continuous_line' | 'polygon' | 'arc',是必要字段
type: 'line',
// 是否要绘制,可缺省,默认绘制
isDraw: true,
// 是否要检查是否在图形上,可缺省,默认不检查
isCheck: true,
// 样式
styles: {},
// 数据数组,当type是'line'时是二维数组
dataSource: []
}
```
```javascript
{
// x坐标,必要字段
x: 123,
// y坐标,必要字段
y: 123,
// 半径,当type为'arc'时需要
radius: 5,
// 起始角度,当type为'arc'时需要
startAngle: 0,
// 结束角度,当type为'arc'时需要
endAngle: 180,
// 文字,当type为'text'时需要
text: '',
}
```
以一个填充带边框的圆来具体说明如何配置。
```javascript
{
// 名称
name: 'circle',
// 完成一个圆的绘制需要三个步骤
totalStep: 3,
// 检查事件坐标是否在圆边框上
checkEventCoordinateOnShape: ({ dataSource, eventCoordinate }) => {
const xDis = Math.abs(dataSource.x - eventCoordinate.x)
const yDis = Math.abs(dataSource.y - eventCoordinate.y)
const r = Math.sqrt(xDis * xDis + yDis * yDis)
return Math.abs(r - dataSource.radius) < 2;
},
// 创建图形信息
createShapeDataSource: ({ step, points, coordinates }) => {
if (coordinates.length === 2) {
const xDis = Math.abs(coordinates[0].x - coordinates[1].x)
const yDis = Math.abs(coordinates[0].y - coordinates[1].y)
const radius = Math.sqrt(xDis * xDis + yDis * yDis)
// 通过一个空心圆和一个实心圆来组成一个填充带边框的圆
return [
// 实心圆
{
type: 'arc',
isDraw: true,
// 实心圆,不用去检查鼠标点是否在图形上
isCheck: false,
// 填充
styles: { style: 'fill' },
// 点信息
dataSource: [
{ ...coordinates[0], radius, startAngle: 0, endAngle: Math.PI * 2 },
]
},
// 空心圆
{
type: 'arc',
isDraw: true,
// 需要检查是否在边框上
isCheck: true,
// 点信息
dataSource: [
{ ...coordinates[0], radius, startAngle: 0, endAngle: Math.PI * 2 },
]
}
]
}
return []
}
}
```