绘制K线第二章:背景网格绘制

作者:佛系打工仔日期:2026/1/13

绘制K线第二章:背景网格绘制

在第一章的基础上,我们简单修饰一下,补充一个背景九宫格的绘制功能。这个功能可以让K线图更加清晰易读,帮助用户快速定位价格和时间。

二、网格配置

确定网格的行数和列数

在绘制网格之前,我们需要确定:

  • 几行:将高度分成几等份(对应价格轴)
  • 几列:将宽度分成几等份(对应时间轴)

例如:4列5行,表示宽度分成4等份,高度分成5等份。

在Config中配置

为了灵活配置网格,我们在 KLineConfig 中添加了两个字段:

1data class KLineConfig(
2    // ... 其他配置 ...
3    
4    /**
5     * 网格列数
6     * 默认:4列
7     */
8    val gridColumnCount: Int = 4,
9    
10    /**
11     * 网格行数
12     * 默认:5行
13     */
14    val gridRowCount: Int = 5
15)
16

模型改动

  • KLineConfig 新增 gridColumnCountgridRowCount 字段
  • 默认值:4列5行
  • 可以通过配置灵活调整网格密度

三、绘制网格线

计算网格线位置

核心公式

  • 列间距 = 宽度 ÷ 列数
  • 行间距 = 高度 ÷ 行数

绘制代码

1private fun drawBackgroundGrid(canvas: Canvas, width: Float, height: Float) {
2    val columnWidth = width / config.gridColumnCount
3    val rowHeight = height / config.gridRowCount
4    
5    // 绘制竖线
6    for (i in 1 until config.gridColumnCount) {
7        val x = columnWidth * i
8        canvas.drawLine(x, 0f, x, height, gridPaint)
9    }
10    
11    // 绘制横线
12    for (i in 1 until config.gridRowCount) {
13        val y = rowHeight * i
14        canvas.drawLine(0f, y, width, y, gridPaint)
15    }
16}
17

四、价格标签绘制

计算价格步长

价格标签显示在右侧Y轴,需要根据网格横线位置计算对应的价格值。

价格步长

1val priceStep = (maxPrice - minPrice) / config.gridRowCount
2
  • 将价格范围(最高价-最低价)平均分成行数等份
  • 例如:价格范围1000-800=200,5行,步长=200÷5=40

获取具体价格

价格计算公式

1for (i in 0 until config.gridRowCount) {
2    val price = priceStep * (config.gridRowCount - i) + minPrice
3}
4

五、时间标签绘制

计算网格竖线位置

时间标签显示在底部X轴,需要根据网格竖线位置找到对应的K线数据。

网格竖线X坐标

1val columnWidth = width / config.gridColumnCount
2val gridX = columnWidth * i  // i从0到gridColumnCount-1
3

从数据中获取时间

根据X坐标找到K线索引

1val totalCandleWidth = config.getTotalCandleWidth()  // 每根K线宽度
2val dataIndex = (gridX / totalCandleWidth).toInt().coerceIn(0, visibleData.size - 1)
3

逻辑说明

  • 将网格X坐标转换为K线索引
  • 索引 = 网格X坐标 ÷ 每根K线宽度(取整)
  • 限制在可见数据范围内

获取时间并绘制

1val dateText = formatDate(visibleData[dataIndex].Date)
2canvas.drawText(dateText, gridX, y, labelPaint)
3
  • 从对应K线数据的 Date 字段获取时间
  • 格式化后(如:yyyy/MM/dd → MM/dd)绘制在网格竖线位置

六、Case2 与 Case3 的区别

Case2(可见区间版本)

功能

  • 绘制蜡烛图
  • 处理可见区间
  • 无网格线和标签

Case3(网格+标签版本)

功能

  • 绘制蜡烛图
  • 处理可见区间
  • 新增:绘制背景网格(4列5行)
  • 新增:显示价格标签(右侧Y轴)
  • 新增:显示时间标签(底部X轴)

核心区别

功能Case2Case3
可见区间处理
背景网格
价格标签
时间标签

七、效果


绘制K线第二章:背景网格绘制》 是转载文章,点击查看原文


相关推荐


Linux系统安全及应用(账号权限管理、登录控制、弱口令、端口扫描)
晚风吹人醒.2026/1/5

目录 1. 账号管理与权限控制         1.1 基本安全措施:                 1.1.1 账号管理和文件权限                 1.1.2 密码安全控制                 1.1.3历史命令和自动注销         1.2 用户切换与提权: 2. 系统引导与登录控制         2.1 开关机安全控制:                 2.1.1 GRUB                 2.1.2 限制更改GRUB


算法竞赛中的数据结构:图
喜欢吃燃面2025/12/27

目录 一.图的基本概念1.图的定义2.图、树、线性表的联系与区别2.1 核心联系2.2 核心区别 二.图的分类1.按边的方向分类2.按边的权重分类3 .按顶点和边的数量分类4 .按连通性分类(针对无向图)5 .按强连通性分类(针对有向图)6 .其他特殊类型7.顶点的度(补充)8.路径及相关长度概念(补充)8.1 路径8.2 路径长度(无权图)8.3 带权路径长度(带权图)8.4 核心区别对比 三.邻接矩阵1.邻接矩阵【注意】 四.邻接表五.链式前向星


ZooKeeper+Kafka
吉良吉影1232025/12/18

目录 一、Zookeeper 1.1 Zookeeper 概述 1.2 Zookeeper 工作机制 1.3 ZooKeeper 特点 1.4 Zookeeper 数据结构 1.5 ZooKeeper 应用场景 1.6 Zookeeper 选举机制 1.6.1 第一次启动选举机制 1.6.2 非第一次启动选举机制 Leader 的作用 1. 处理所有写请求(核心职责) 2. 主导 Leader 选举 3. 管理集群数据同步 4. 维护集群状态 Follower


编程界 语言神 : 赶紧起来学 Rust 了!
Pomelo_刘金2025/12/10

大家对 Rust 的印象 没接触过的: 编程界语言神 整天重构这重构那 还要 要干掉 c++ ?! 稍微了解过的: 学习曲线: 但实际上是: 第一个高峰是 借用检查器,第二个是异步,第三个是unsafe,第四个是宏怎么玩? 开始接触之后 编译器不让我写代码,怎么写都报错 写 rust 代码像是在跟 rust 编译器谈对象 , 我只是传个参数,你跟我讲所有权、借用、生命周期?” 写的代码上线之后,还不错哦 “别的语言项目上线流程” 内容: 编译 ✔ 测试(偶尔挂一两条)✔ 上线后:半


LangChain 深入
吴佳浩2025/12/1

LangChain 深入 这里需要装什么包什么依赖 我就不再一一赘述了 大家可以先看上一篇 《Langchain 浅出》 那么如果出现缺失的依赖怎么办 ?简单 缺什么装什么 目录 1、Python 依赖安装 2、词工程最佳实践 3、性能优化技巧 4、常见问题与解决方案 5、调试和错误处理 6、生产环境最佳实践 想了想还是给补一份基础的依赖吧 ,至于为什么,我也不知道 但是我还是补上了 另外 本章篇幅比较密的代码示例需要个人花点时间理解和消化有问题可以在评论区交流 Python 依


Python 线程局部存储:threading.local() 完全指南
哈里谢顿2026/1/21

一句话总结: threading.local() 是 Python 标准库提供的「线程局部存储(Thread Local Storage, TLS)」方案,让同一段代码在不同线程里拥有各自独立的变量空间,从而避免加锁,也避免了层层传参的狼狈。 1. 为什么需要线程局部存储? 在多线程环境下,如果多个线程共享同一个全局变量,就必须: 加锁 → 代码变复杂、性能下降; 或者层层传参 → 代码臃肿、可维护性差。 有些场景只想让线程各自持有一份副本,互不干扰: Web 服务:每个请求线程绑定自

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客