鸿蒙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

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.