RecyclerChart的KLine的绘制

目录
  • 正文
  • StockValueFormatter
  • 绘制蜡烛图

正文

继上次章节介绍完RecyclerChart的一些动态属性之后,本章节开始基于RecyclerChart绘制新的图表,股票相关的Chart,笔者花了大概一天,绘制如下的一个效果,发现换了电脑之后没有装PS,所以CandleChart的颜色自己随意取的。其实无论绘制什么业务的图形,最终交给图表的不过是一堆要展示的数据而已。

下面是gif图,还有好些功能没有加,比如高亮用的是原来的RecyclerChart之前的样式。Kline作为CombineChart,还有5日、10日、20日均线的绘制等以及底部一系列的比如MACD, 成交量图等待该系列后续渐渐实现

基于RecyclerChart绘制一种新的图表,类似于搭积木一样,之前的心电图也是如此。

绘制前列一个提纲,然后依此逐一实现即可:

1.创建 StockAttr、StockBean,  StockEntity.

2.创建 StockChartRecyclerView, StockChartRenderer,StockChartItemDecoration,

StockValueFormatter

3. 绘制主体的 drawChart.

4. Mock Bean, Entity数据。

5. 绘制 HighLight

6. 绘制 XAxis

7. 绘制 YAxis,  最大、最小值局部留有 padding

8. 尝试添加缩放, OnScaleGestureListener; Matrix , onTouch .  根据缩放比例,调整 RecyclerChart的 displayNumber, notifyDataChange。

绘制蜡烛图

1.计算 color, 参照上个Entry的 close大小。 定义 mStockAttrs 里的两种 color值,并且是否 Fill。

2. 画上引线、下引线。

图表的样式跟它所依赖的数据是相对应的,然后就是一个业务数据到Chart数据的一个转化,然后图表依照Chart数据进行绘制即可。这里的YAxis、XAxis、board, HighLight 好些跟之前的都是相通的,部分可以复用;注意一些边界上的处理。

主要是CandleChart的绘制,其实里面的主体逻辑跟之前的BarChart也是类似的;这里看看代码吧:

fun <Y : YAxis> drawStockChart(canvas: Canvas, parent: RecyclerView, yAxis: Y) {
  val parentRight = (parent.width - parent.paddingRight).toFloat()
  val parentLeft = parent.paddingLeft.toFloat()
  val childCount = parent.childCount
  for (i in 0 until childCount) {
    val child = parent.getChildAt(i)
    val stockEntry = child.tag as StockEntry
    val rectMain = getStockRectF(child, parent, yAxis, mStockAttrs, stockEntry)
    val radius = 1f
    val color = if (stockEntry.isRise) mStockAttrs.riseColor else mStockAttrs.downColor
    mBarChartPaint.color = color
    //todo 注意RTL
    drawChart(canvas, rectMain, parent.left.toFloat(), parent.right.toFloat(), radius)
    mHighLightLinePaint.color = color
    if (stockEntry.mShadowHigh > Math.max(stockEntry.mClose, stockEntry.mOpen)){
      drawTopLine(stockEntry.mShadowHigh, canvas, rectMain, yAxis, parent)
    }
    if (stockEntry.mShadowLow < Math.min(stockEntry.mClose, stockEntry.mOpen)){
      drawDownLine(stockEntry.mShadowLow, canvas, rectMain, yAxis, parent)
    }
  }
}

这里包含了主体柱子Chart的绘制,以及上引线、下引线的绘制。

//绘制上引线、下引线
private fun drawTopLine(value:Float, canvas: Canvas, rectF: RectF, yAxis: YAxis,  parent: RecyclerView){
  canvas.save()
  val y = getYPosition(value, parent, yAxis, mStockAttrs)
  val x = (rectF.left + rectF.right)/2
  if (DecimalUtil.bigOrEquals(x, parent.left.toFloat()) && DecimalUtil.smallOrEquals(x, parent.right.toFloat())){
  canvas.drawLine(x, rectF.top, x, y, mHighLightLinePaint)
  canvas.restore()
}
}
//下引线
private fun drawDownLine(value:Float, canvas: Canvas, rectF: RectF, yAxis: YAxis,  parent: RecyclerView){
  canvas.save()
  val y = getYPosition(value, parent, yAxis, mStockAttrs)
  val x = (rectF.left + rectF.right)/2
  if (DecimalUtil.bigOrEquals(x, parent.left.toFloat()) && DecimalUtil.smallOrEquals(x, parent.right.toFloat())){
  canvas.drawLine(x, rectF.bottom, x, y, mHighLightLinePaint)
  canvas.restore()
}
}

绘制Chart 主体,按照先前的绘制,左右边界的处理。目前还是有些bug, 先处理主逻辑,后续修复吧。

private fun drawChart(canvas: Canvas, rectF: RectF, parentLeft: Float, parentRight: Float, radius: Float) {
    // 浮点数的 == 比较需要注意
    if (DecimalUtil.smallOrEquals(rectF.right, parentLeft)) {
    //continue 会闪,原因是end == parentLeft 没有过滤掉,显示出来柱状图了。
    } else if (rectF.left < parentLeft && rectF.right > parentLeft) {
    //左边部分滑入的时候,处理柱状图的显示
    rectF.left = parentLeft
    val path = CanvasUtil.createRectRoundPath(rectF, radius, RoundRectType.TYPE_RIGHT_TOP)
    mBarChartPaint.color = mBarChartAttrs.chartEdgeColor
    canvas.drawPath(path, mBarChartPaint)
    } else if (DecimalUtil.bigOrEquals(rectF.left, parentLeft) && DecimalUtil.smallOrEquals(rectF.right, parentRight)) {
    // 中间部分的Item
    val path = CanvasUtil.createRectRoundPath(rectF, radius, RoundRectType.TYPE_ALL)
    canvas.drawPath(path, mBarChartPaint)
    //            canvas.drawRoundRect(rectF, radius, radius, mBarChartPaint);
    } else if (DecimalUtil.smallOrEquals(rectF.left, parentRight) && rectF.right > parentRight) {
    //右边部分滑出的时候,处理柱状图,文字的显示
    val distance = parentRight - rectF.left
    rectF.right = rectF.left + distance
    val path = CanvasUtil.createRectRoundPath(rectF, radius, RoundRectType.TYPE_LEFT_TOP)
    mBarChartPaint.color = mBarChartAttrs.chartEdgeColor
    canvas.drawPath(path, mBarChartPaint)
    }
}

总体大致上,思路还是蛮简单的,关于动态加载数据,高亮,Y轴在滑动过程中动态调整,随时更改Max/Min值等功能都是公用之前的逻辑。

然后就是下一章节的需要实现的均线跟Candle Chart 在一个For循环里绘制,省开销,计划将均线的Bean数据放StockEntity,方便在一个For里拿去。再就是里面草稿大纲里提到的第8项,图表的缩放的功能,大致的思路如上所述,待实现。

以上就是RecyclerChart的KLine的绘制的详细内容,更多关于RecyclerChart KLine绘制的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android RecyclerChart其它图表绘制示例详解

    目录 正文 1. 心电图 2. 睡眠图 正文 之前章节介绍了RecyclerChart 中一些通用的图表的相关绘制逻辑,本章节介绍两种Special的Chart的绘制,一种是心电图,一种是睡眠图.首先我们来看下心电图EcgChart的绘制. 1. 心电图 EcgChart 跟LineChart形态上是相似的,但是EcgChart的点相对于LineChart密集的多,之前的LineChart相当于每个RecyclerView的Itemview 中的Model对应的value值,而心电图的ItemD

  • 基于RecyclerChart的KLine绘制Volume实现详解

    目录 正文 创建AttacheChart YAxis Attache Chart绘制 正文 本章节是基于RecyclerChart的KLine 绘制第三章节,底部AttacheChart 成交量图表 Volume的绘制,可以看到直接在原来的KLine MainChart下面绘制的,用的是第二章最后提及的方案,就是跟MainChart的绘制在一个For循环里处理的,所以也不存在两表联动的问题了.但是这个方案可能会有个隐患,这个后面提及吧,暂时放一放,直接看gif效果图(没有设计UI的出图,暂且看着

  • 基于RecyclerChart的KLine绘制详解

    本章节是KLine的绘制的第二章节,在原来的基础上绘制5.10.20日均线.下面是gif的效果. 其实只是把线性图表的绘制逻辑搬到这边一起,上篇文章提到在一个For循环里处理,减少遍历,之前是通过Entry的Y值找对应的PointF的Y值,这里需要用StockEntry中的5日.10日.20日均线值去求值.就是类似的一些逻辑替换,思想还是不变,然后左右边界的处理暂时先放一放,滑动到边界会有一些bug. 同时,这里的均值没有参与到图表YAxis的Max.min的计算中去,会有线出上下边界的情况,待

  • RecyclerChart的KLine的绘制

    目录 正文 StockValueFormatter 绘制蜡烛图 正文 继上次章节介绍完RecyclerChart的一些动态属性之后,本章节开始基于RecyclerChart绘制新的图表,股票相关的Chart,笔者花了大概一天,绘制如下的一个效果,发现换了电脑之后没有装PS,所以CandleChart的颜色自己随意取的.其实无论绘制什么业务的图形,最终交给图表的不过是一堆要展示的数据而已. 下面是gif图,还有好些功能没有加,比如高亮用的是原来的RecyclerChart之前的样式.Kline作为

  • Python数据可视化详解

    目录 一.Matplotlib模块 1.绘制基本图表 1. 绘制柱形图 2. 绘制条形图 3. 绘制折线图 4. 绘制面积图 5. 绘制散点图 6. 绘制饼图和圆环图 2.图表的绘制和美化技巧 1. 在一张画布中绘制多个图表 2. 添加图表元素 3. 添加并设置网格线 4. 调整坐标轴的刻度范围 3.绘制高级图表 1. 绘制气泡图 2. 绘制组合图 3. 绘制直方图 4. 绘制雷达图 5. 绘制树状图 6. 绘制箱形图 7. 绘制玫瑰图 二.pyecharts模块 1.图表配置项 2.绘制漏斗图

  • python pyecharts 实现一个文件绘制多张图

    Grid并行显示多张图 注意: 第一个图需为 有 x/y 轴的图,即不能为 Pie,其他位置顺序任意 from pyecharts import Bar, Line, Scatter, EffectScatter, Grid ''' Grid类:并行显示多个图表 TODO 第一个图需为 有 x/y 轴的图,即不能为 Pie,其他位置顺序任意. ''' attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", &quo

  • Python绘制K线图之可视化神器pyecharts的使用

    K线图 概念 股市及期货市bai场中的K线图的du画法包含四个zhi数据,即开盘dao价.最高价.最低价zhuan.收盘价,所有的shuk线都是围绕这四个数据展开,反映大势的状况和价格信息.如果把每日的K线图放在一张纸上,就能得到日K线图,同样也可画出周K线图.月K线图.研究金融的小伙伴肯定比较熟悉这个,那么我们看起来比较复杂的K线图,又是这样画出来的,本文我们将一起探索K线图的魅力与神奇之处吧! K线图 用处 K线图用处于股票分析,作为数据分析,以后的进入大数据肯定是一个趋势和热潮,K线图的专

  • 详解如何基于Pyecharts绘制常见的直角坐标系图表

    目录 1.直方图 2.折线图 3.箱形图 4.散点图 5.带涟漪效果散点图 6.k线图 7.热力图 8.象型图 9.层叠图 总结 1.直方图 # -*-coding:utf-8 -*- # @Time : 21:02 # @Author: 黄荣津 # @File : 1.直方图.py # @Software: PyCharm from pyecharts.charts import * from pyecharts.components import Table from pyecharts i

  • Android开发X Y轴Board的绘制教程示例

    目录 正文 1. X轴的绘制 2. Y轴的绘制 绘制RightYAxisLabel 3. Board 绘制 正文 上篇大致介绍了RecyclerChart能够绘制的图表,以及一些特有的功能.从这节开始具体地介绍图表的绘制,本节先介绍RcyclerChart中一些图表的相关辅助的绘制,X.Y轴,以及Board的绘制. 上一章节有介绍绘制的逻辑都在ItemDecoration中实现的,而各种图表基本都有X.Y轴.Board相关的绘制,所以把他们的相关逻辑抽象到上层的基类BaseChartItemDe

  • iOS中利用CAGradientLayer绘制渐变色的方法实例

    前言 以前不用自己切图,现在要自己切图,看到设计稿有好多不同规格的渐变色的背景,一个一个切的话好麻烦,没有想到iOS本来就可以实现渐变色.也就是今天的主角CAGradientLayer. 渐变色使用的类是CAGradientLayer,有两个要素,渐变颜色的起点和终点.渐变的颜色集合 简单示例: //设置渐变颜色 CAGradientLayer *gradientLayer = [CAGradientLayer layer]; gradientLayer.frame = view.bounds;

随机推荐