Skip to content

覆盖物

本文档介绍了图表内置的覆盖物和如何自定义一个覆盖物。

内置覆盖物类型

horizontalRayLine, horizontalSegment, horizontalStraightLine, verticalRayLine, verticalSegment, verticalStraightLine, rayLine, segment, straightLine, priceLine, priceChannelLine, parallelStraightLine, fibonacciLine, simpleAnnotation, simpleTag

自定义覆盖物

自定义一个覆盖物,然后通过klinecharts.registerOverlay 全局添加,添加到图表即可和内置覆盖物一样去使用。

属性说明

typescript
{
  // 名称,必须字段,作为覆盖物创建的唯一标识
  name: string

  // 总共需要多少步操作才行绘制完成,非必须
  totalStep?: number

  // 是否锁定,不触发事件,非必须
  lock?: boolean

  // 是否可见
  visible?: boolean

  // 绘制层级,值越大越靠前显示
  zLevel?: number

  // 是否需要默认的点对应的图形,非必须
  needDefaultPointFigure?: boolean

  // 是否需要默认的X轴上的图形,非必须
  needDefaultXAxisFigure?: boolean

  // 是否需要默认的Y轴上的图形,非必须
  needDefaultYAxisFigure?: boolean

  // 模式,可选项为`normal`,`weak_magnet`,`strong_magnet`,非必须
  mode?: 'normal' | 'weak_magnet' | 'strong_magnet'

  // 模式灵敏度,仅 mode 是 weak_magnet 时有效
  modeSensitivity?: number

  // 点信息,非必须
  points?: Array<{
    // 时间戳
    timestamp: number
    // 数据索引
    dataIndex?: number
    // 对应y轴的值
    value?: number
  }>

  // 扩展数据,非必须
  extendData?: any

  // 样式,非必须,类型参与[样式]中的overlay
  styles?: OverlayStyle

  // 创建点对应的图形,非必须
  createPointFigures: ({
    // 覆盖物实例
    overlay: Overlay
    // points对应的坐标信息
    coordinates: Array<{
      x: number
      y: number
    }>
    // 窗口尺寸信息
    bounding: {
      // 宽
      width: number
      // 高
      height: number
      // 距离左边距离
      left: number
      // 距离右边距离
      right: number
      // 距离顶部距离
      top: number
      // 距离底部距离
      bottom: number
    }
    // 蜡烛柱的尺寸信息
    barSpace: {
      // 蜡烛柱尺寸
      bar: number
      halfBar: number
      // 蜡烛柱不包含蜡烛柱之间间隙的尺寸
      gapBar: number
      halfGapBar: number
    }
    // 精度
    precision: {
      // 价格精度
      price: number
      // 数量精度
      volume: number
    }
    // 千分符
    thousandsSeparator: string
    // 小数折叠阈值
    decimalFoldThreshold: number
    // 格式化日期和时间的对象的构造器,详情参阅 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat
    dateTimeFormat: Intl.DateTimeFormat
    // 默认样式,即全局样式配置中的overlay,类型参与[样式]中的overlay
    defaultStyles: OverlayStyle
     // x轴组件,内置一些转换方法
    xAxis: XAxis
    // y轴组件,内置一些转换方法
    yAxis: YAxis
  }) => ({
    // 无特殊含义,可用于扩展字段
    key?: string
    // 图形类型,类型为klinecharts.getSupportFigures返回值中的一种
    type: string
    // type对应的图形的属性
    attrs: any | any[]
    // type对应的图形的样式
    styles?: any
    // 是否忽略事件
    ignoreEvent?: boolean | OverlayFigureIgnoreEventType[]
  }) | Array<{
    key?: string
    type: string
    attrs: any | any[]
    styles?: any
    ignoreEvent?: boolean | OverlayFigureIgnoreEventType[]
  }>

  // 创建X轴上的图形,非必须,参数和返回值和`createPointFigures`一致
  createXAxisFigures?: OverlayCreateFiguresCallback

  // 创建Y轴上的图形,非必须,参数和返回值和`createPointFigures`一致
  createYAxisFigures?: OverlayCreateFiguresCallback

  // 处理在绘制过程中移动操作,可缺省,移动绘制过程中触发
  performEventMoveForDrawing?: ({
    // 当前步骤
    currentStep: number
    // 模式
    mode: 'normal' | 'weak_magnet' | 'strong_magnet'
    // 点信息
    points: Array<{
      // 时间戳
      timestamp: number
      // 数据索引
      dataIndex?: number
      // 对应y轴的值
      value?: number
    }>
    // 事件所在点的索引
    performPointIndex: number
    // 事件所在点的信息
    performPoint: {
      // 时间戳
      timestamp: number
      // 数据索引
      dataIndex?: number
      // 对应y轴的值
      value?: number
    }
  }) => void

  // 处理按住移动操作,可缺省,按住某个操作点移动过程中触发
  // 回调参数和`performEventMoveForDrawing`一致
  performEventPressedMove?: (params: OverlayPerformEventParams) => void

  // 绘制开始回调事件,可缺省
  onDrawStart?: (event: OverlayEvent) => boolean

  // 绘制过程中回调事件,可缺省
  onDrawing?: (event: OverlayEvent) => boolean

  // 绘制结束回调事件,可缺省
  onDrawEnd?: (event: OverlayEvent) => boolean

  // 点击回调事件,可缺省
  onClick?: (event: OverlayEvent) => boolean

  // 双击回调事件,可缺省
  onDoubleClick?: (event: OverlayEvent) => boolean

  // 右击回调事件,可缺省,需要返回一个boolean类型的值,如果返回true,内置的右击删除将无效
  onRightClick?: (event: OverlayEvent) => boolean

  // 按住拖动开始回调事件,可缺省
  onPressedMoveStart?: (event: OverlayEvent) => boolean

  // 按住拖动回调事件,可缺省  
  onPressedMoving?: (event: OverlayEvent) => boolean

  // 按住拖动结束回调事件,可缺省
  onPressedMoveEnd?: (event: OverlayEvent) => boolean

  // 鼠标移入事件,可缺省
  onMouseEnter?: (event: OverlayEvent) => boolean

  // 鼠标移出事件,可缺省
  onMouseLeave?: (event: OverlayEvent) => boolean

  // 删除回调事件,可缺省
  onRemoved?: (event: OverlayEvent) => boolean

  // 选中回调事件,可缺省
  onSelected?: (event: OverlayEvent) => boolean

  // 取消回调事件,可缺省
  onDeselected?: (event: OverlayEvent) => boolean
}

示例

以一个填充带边框的圆来具体说明如何配置。

javascript
{
  // 名称
  name: 'sampleCircle',

  // 完成一个圆的绘制需要三个步骤
  totalStep: 3,

  // 创建点对应的图形信息
  createPointFigures: ({ 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)
      // 图表内置了基础图形'circle',可以直接使用
      return {
        key: 'sampleCircle',
        type: 'circle',
        attrs: {
          ...coordinates[0],
          r: radius
        },
        styles: {
          // 选择边框且填充,其它选择使用默认样式
          style: 'stroke_fill'
        }
      }
    }
    return []
  }
}

这样一个自定义覆盖物就完成了。