鸿蒙Canvas自定义View之k线图绘制

2024-04-26 17:04

本文主要是介绍鸿蒙Canvas自定义View之k线图绘制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

API级别:9

参考官网文档:

使用画布绘制自定义图形(Canvas)-显示图形-基于ArkTS的声明式开发范式-UI开发-开发 | 华为开发者联盟 (huawei.com)

代码:

K线绘制代码


import { KLineBean } from '../bean/KLineBean'@Component
export struct KLineView{// 开启抗锯齿private settings : RenderingContextSettings = new RenderingContextSettings(true)private canvasContext: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)kLineList: KLineBean[] = new Array()@State totalWidth:number = 300.0@State totalHeight:number = 100.0kLineNum = 30linePadding = 0.2lineWidth = 0.2uH = 0.0uW = 0.0aboutToAppear(){// 初始化数据for(let i = 0; i < this.kLineNum; i++){let kLineBean = new KLineBean()kLineBean.low = Math.floor(Math.random() * 100)kLineBean.high = kLineBean.low + 30kLineBean.open = kLineBean.low + Math.floor(Math.random() * 30)kLineBean.close = kLineBean.low + Math.floor(Math.random() * 30)this.kLineList.push(kLineBean)}this.uH = this.calculatorUnitH(this.kLineList)this.uW = (this.totalWidth - 20) / this.kLineNum - this.linePadding * 2}calculatorUnitH(kLineList: KLineBean[]): number{let result = 0.0let lowNum = Number.MAX_VALUElet highNum = 0.0for(let i =0; i <kLineList.length; i++){let bean = kLineList[i]if(lowNum > bean.low){lowNum = bean.low}if(highNum < bean.high){highNum = bean.high}}result =  (this.totalHeight)/(highNum - lowNum)return result}/*** 1.设置控件宽高* 2.根据控件高度的最大和最小值之差,得到绘图的单位长度 unitH = 差/ (高度 - padding)* 3.根据k线数据数量,得到单位K线的宽度 unitW = w/number* 4.绘制每根K线的高低线和开盘收盘矩形,并根据开盘收盘价来设置绘制颜色*/build(){Flex(){Canvas(this.canvasContext).width("100%").height("100%").backgroundColor('#ffffff').onReady(()=>{this.canvasContext.strokeStyle = '#EDEEEF'this.canvasContext.strokeRect(0, 0, this.totalWidth, this.totalWidth)for(let i = 0; i < this.kLineList.length; i++){let bean = this.kLineList[i]console.log(" testTag  low:" + bean.low + "  high:" + bean.high + "  open:" + bean.open + "  close:" + bean.close)/// 画线 1.定位线的起点和终点 起点纵轴为 控件高度 - (uH * high), 终点为 控件高度 - (uH * low)///       起点横轴为 i * uW  + uW/2 + linePadding// 设置直线的颜色if(bean.close > bean.open){this.canvasContext.strokeStyle = '#ff0000'}else{this.canvasContext.strokeStyle = '#00ff00'}this.canvasContext.lineWidth = this.lineWidththis.canvasContext.beginPath()this.canvasContext.moveTo( i * this.uW + this.uW / 2 + (2 * i + 1) * this.linePadding ,this.totalHeight - (this.uH * bean.high))this.canvasContext.lineTo( i * this.uW + this.uW / 2 + (2 * i + 1) * this.linePadding ,this.totalHeight - (this.uH * bean.low))this.canvasContext.stroke()/// 画矩形: 纵轴为 控件高度 - (uH * Math.max(open, close)) 横轴为 i * (uW + linePadding * 2)///      宽为 uW,高为 (uH * Math.abs(open - close)if(bean.close > bean.open){this.canvasContext.fillStyle = '#ff0000'}else{this.canvasContext.fillStyle = '#00ff00'}let y = this.totalHeight - (this.uH * Math.max(bean.open, bean.close))let x = i * (this.uW + this.linePadding * 2) + this.linePaddinglet w = this.uWlet h = this.uH * Math.abs(bean.close - bean.open)if(h == 0){h = 1;}this.canvasContext.fillRect(x,y, w,h)}})}.width('100%').height('100%').padding({left:20})}positionXStart(index: number): number{return index * (this.uW + this.linePadding * 2)}positionXCenter(index: number):number{return  index * this.uW + this.uW / 2 + (2 * index + 1) * this.linePadding}}

数据结构代码:


export class KLineBean{low: numberhigh: numberopen: numberclose: numberdate : string
}

应用效果:

这篇关于鸿蒙Canvas自定义View之k线图绘制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/938143

相关文章

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof