RecyclerChart的KLine的绘制

 更新时间:2023年03月02日 08:45:28   作者:cxy107750  
这篇文章主要为大家介绍了RecyclerChart的KLine的绘制示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

继上次章节介绍完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绘制的资料请关注脚本之家其它相关文章!

相关文章

  • Java实现统计在线人数功能的方法详解

    Java实现统计在线人数功能的方法详解

    很多人在笔试或者面试中问到:现在要你实现一个统计在线人数的功能,你该怎么设计?不知道的朋友,这篇文章就来告诉你具体实现方法
    2022-08-08
  • Java Web请求与响应实例详解

    Java Web请求与响应实例详解

    这篇文章主要介绍了Java Web请求与响应实例详解的相关资料,需要的朋友可以参考下
    2016-05-05
  • Java实现快速并查集

    Java实现快速并查集

    这篇文章主要为大家详细介绍了Java实现快速并查集,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • zookeeper概述图文详解

    zookeeper概述图文详解

    今天小编就为大家分享一篇关于Zookeeper概述图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Spring Boot3整合Mybatis Plus的详细过程(数据库为MySQL)

    Spring Boot3整合Mybatis Plus的详细过程(数据库为MySQL)

    这篇文章主要介绍了Spring Boot3整合Mybatis Plus的详细过程(数据库为MySQL),本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • MyBatis批量更新(update foreach)报错问题

    MyBatis批量更新(update foreach)报错问题

    这篇文章主要介绍了MyBatis批量更新(update foreach)报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • spring boot配置druid连接池的完整步骤

    spring boot配置druid连接池的完整步骤

    这篇文章主要给大家介绍了关于spring boot配置druid连接池的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Java中import java.util.Scanner的用处详解

    Java中import java.util.Scanner的用处详解

    文章主要介绍Java中的Scanner类及其常用方法next()和nextLine()的区别,next()方法在遇到空格、Tab键、回车键等分隔符时结束输入,而nextLine()方法则接收所有输入,直到遇到回车键
    2024-11-11
  • 一文详解Spring是怎样处理循环依赖的

    一文详解Spring是怎样处理循环依赖的

    循环依赖简单理解就是A,B 两个bean相互依赖,A依赖B,B依赖A,A->B、B->A大概就是这样,这篇文章主要介绍了Spring是怎样处理循环依赖的,文中通过代码示例给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-01-01
  • java 出现Zipexception 异常的解决办法

    java 出现Zipexception 异常的解决办法

    这篇文章主要介绍了java 出现Zipexception 异常的解决办法的相关资料,出现 java.util.zip.ZipException: error in opening zip file 异常的原因及解决方法,需要的朋友可以参考下
    2017-08-08

最新评论