使用自定义View来实现K线图、分时图

  • 实现原理
    • 1.分时图
    • 2.K线图
    • 3.十字标
    • 4.缩放、滑动
  • 实现步骤
    • 基类BaseChart
    • 画图
  • 总结
    • 下面附上Demo的下载地址

废话不多说 先上效果图

实现原理

1.分时图

分时图一般有两条线,一条均价线,一条时价线。其实每条线都是由很多点组合而来,通过canvas.drawLine方法将每两个点进行连接,最终绘制出分时图。

2.K线图

K线图是由一个一个的矩形组合而来,每个矩形代表了一个时间段的相关价格,通过这些价格来确定当前时间段的矩形的位置,这样就绘制出K线图。关于K线图的一些基础知识,如阴线、阳线、高开低收,去百度学习下,这样开发起来会方便很多。

3.十字标

首先对View进行手势监听GestureDetector,当触发长按onLongPress方法时,记录当前手指的X坐标,通过当前X坐标获取当前时间的Y轴坐标,最终绘制出十字标。

4.缩放、滑动

分时图是没有缩放和滑动功能的,所以主要说说K线图。
K线图的数据点有很多,但是一般在屏幕上不会展示完,所以我们要确定屏幕可以展示的矩形个数,并且展示的数据源的start、end。 滑动和缩放其实只是不停重新绘制的过程,滑动是改变数据源的start、end,缩放则是改变矩形个数。

实现步骤

基类BaseChart

BaseChart中除了包含了一些公用的常量和方法外,主要是定义了绘制步骤。

//1.初始化数据
initWidthAndHeight();
//2.画网格
drawGrid(canvas);
//3.画线
drawLine(canvas);
//4.画XY轴上的值
drawXYText(canvas);

画图

  1. initWidthAndHeight中我们需要来获取当前数据源在Y轴的最大值和最小值mMaxmMin,来确定Y轴上面的刻度值,在分时图中还需要确定当日的开盘时间和收盘时间;
  2. 有了上面的那些数据,我们就可以愉快的在drawGrid中绘制表格;
        mLinePaint.reset();mLinePaint.setAntiAlias(true);mLinePaint.setColor(color_grid);//X方向drawXGrid(canvas);//Y方向drawYGrid(canvas);
  1. drawLine则是画图的核心方法,循环遍历当前数据源的每条数据,将数据换算成图上的每一个点;
        mLinePaint.reset();mLinePaint.setStyle(Paint.Style.STROKE);    // 填充模式 - 描边mLinePaint.setStrokeWidth(pointWidth);mLinePaint.setAntiAlias(true);for (LineBean lineBean : mData) {if (!lineBean.isDisplay())return;float x = 0f;PointF pricePoint = null;Path shadowPaht = new Path();shadowPaht.moveTo(x, chartHeight);for (int i = 0; i < lineBean.getLineData().size(); i++) {LineBean.Line bean = lineBean.getLineData().get(i);//绘制时价mLinePaint.setColor(lineBean.getLineColor());float y = doubleToY(bean.getPrice());if (pricePoint == null) {pricePoint = new PointF(x, y);}canvas.drawLine(pricePoint.x, pricePoint.y, x, y, mLinePaint);//绘制阴影shadowPaht.lineTo(x, y);if (i == lineBean.getLineData().size() - 1 && TSChartFragment.TIME_TAG.equals(lineBean.getTag())) {shadowPaht.lineTo(x, chartHeight);shadowPaht.close();mLinePaint.setColor(color_shadow);mLinePaint.setStyle(Paint.Style.FILL);mLinePaint.setAlpha(100);canvas.drawPath(shadowPaht, mLinePaint);}pricePoint.x = x;pricePoint.y = y;x = (float) (x + pointWidth + lineLength);}}
       mLinePaint.reset();mLinePaint.setAntiAlias(true);mLinePaint.setStrokeWidth(crossLineWidth);mTextPaint.reset();mTextPaint.setAntiAlias(true);mTextPaint.setTextSize(f10);mTextPaint.setColor(getResources().getColor(R.color.color_white));XList.clear();float x = (float) (stickWidth / 2);for (int i = start; i < end; i++) {if (kBean.getLineData().size() <= i) {continue;}KBean.KLine bean = kBean.getLineData().get(i);if (bean.getClose() > bean.getOpen()) { //阳线mLinePaint.setColor(colorRed);mLinePaint.setStyle(Paint.Style.STROKE);} else {mLinePaint.setColor(colorGreen);mLinePaint.setStyle(Paint.Style.FILL);}//绘制蜡烛矩形canvas.drawRect((float) (x - stickWidth / 2), doubleToY(bean.getClose()),(float) (x + stickWidth / 2), doubleToY(bean.getOpen()), mLinePaint);canvas.drawLine(x, doubleToY(bean.getHigh()), x, doubleToY(Math.max(bean.getClose(), bean.getOpen())), mLinePaint);canvas.drawLine(x, doubleToY(bean.getLow()), x, doubleToY(Math.min(bean.getClose(), bean.getOpen())), mLinePaint);//绘制最高价和最低价if (bean.getHigh() == priceHigh) {drawHighLow(canvas, x, priceHigh);} else if (bean.getLow() == priceLow) {drawHighLow(canvas, x, priceLow);}XList.add(x);x += stickWidth + spaceWidth;}
  1. 最后通过drawXYText绘制XY轴上的刻度值,显示在K线、分时线上面,避免被覆盖造成无法看清的问题;
  2. 最后的最后还需要加上十字标;
      if (isShowCross) {int index = (int) (crossX / chartWidth * getSize());KBean.KLine bean = kBean.getLineData().get(start + index);crossX = XList.get(index);crossY = doubleToY(bean.getClose());mLinePaint.reset();mLinePaint.setAntiAlias(true);mLinePaint.setColor(color_cross);mLinePaint.setStyle(Paint.Style.FILL);    // 填充模式 - 描边mLinePaint.setStrokeWidth(crossLineWidth);//画线canvas.drawLine(0, crossY, chartWidth, crossY, mLinePaint);canvas.drawLine(crossX, 0, crossX, chartHeight, mLinePaint);}

总结

关于数据基类bean,注释已经写得很清楚了。

/*** 线标题*/private String tag;/*** 线表示颜色*/private int lineColor;/*** 是否显示线*/private boolean display = true;

还有K线和分时线一起绘制的,在demo中没有使用。不过大家可以自己摸索实现下,毕竟整明白了还是挺简单的。

下面附上Demo的下载地址

https://github.com/limbowangqi/ChartDemo

Android使用自定义View来实现K线图、分时图相关推荐

  1. 【微信小程序经验】各类图表相关组件+Demo源码(折线图,柱状图,K线,分时图)

    各类图表功能,小程序自带API并没有提供,所以很多人就用了其他方法来实现,我将这些实现方法和教程聚合一下,以便能够迅速而方便的使用: 相关文章: 在微信小程序中绘制图表(part1) 在微信小程序中绘 ...

  2. 【Android】自定义View、画家(画布)Canvas与画笔Paint的应用——画图、涂鸦板app的实现

    利用一个简单的画图app来说明安卓的图形处理类与自定义View的应用. 如下图,有一个供用户自己任意画图.涂鸦的app, 这里不做那么花俏了,仅提供黑白两色,但可以改变笔尖的粗细. 实质上这里的橡皮擦 ...

  3. android开发自定义View(三)仿芝麻信用积分

    此文参考了https://github.com/HotBitmapGG/CreditSesameRingView 感谢作者的分享!! 首先看一下支付宝上显示的样子 然后看一下模仿的效果 代码 基础部分 ...

  4. android 动态画直线,Android使用自定义view在指定时间内匀速画一条直线的实例代码...

    本文讲述了Android使用自定义view在指定时间内匀速画一条直线的实例代码.分享给大家供大家参考,具体如下: 1.效果图: 2.自定义view实现 public class UniformLine ...

  5. Android 系统(264)---android进阶——自定义View

    android进阶--自定义View 软件架构 01.自定义View简介 - onMeasure,onDraw,自定义属性  https://www.jianshu.com/p/48944aad200 ...

  6. android 动态生成直线,Android使用自定义view在指定时间内匀速画一条直线的实例代码...

    本文讲述了Android使用自定义view在指定时间内匀速画一条直线的实例代码.分享给大家供大家参考,具体如下: 1.效果图: 2.自定义view实现 public class UniformLine ...

  7. android五子棋编程教程全集,android简单自定义View实现五子棋

    本文实例为大家分享了android自定义View实现五子棋的具体代码,供大家参考,具体内容如下 先说一下吧,android的自定义View就是自己实现一个类去继承View,实现其中的方法,这里面我最感 ...

  8. HQChart使用教程2- 如何把自定义指标显示在K线图页面

    如何把自定义指标显示在K线图页面 自定义一个指标 通过Option设置指标 自定义一个带参数的指标 让我们用上证指数来回测这个奇葩的BS指标吧 HQChart代码地址 效果图 自定义一个指标 假设我们 ...

  9. Android 中自定义View 裁剪扇形图片

    Android 中自定义View 裁剪扇形图片 当需要裁剪图片为扇形区域时,使用Canvas.clipPath(path)方法可以裁剪为扇形区域 ps:此方法会导致绘制图片边缘有锯齿,暂无解决方法(知 ...

最新文章

  1. Linear regression with one variable算法实例讲解(绘制图像,cost_Function ,Gradient Desent, 拟合曲线, 轮廓图绘制)_矩阵操作...
  2. VitrualBox、vagrant、homestead的关系
  3. php cgi路径解析,php.ini中的cgi.fix_pathinfo选项
  4. Adding Applications for JavaScript Storefronts in SAP 电商云
  5. 我所知道的Ribbon库
  6. 如何理解高并发中的协程?协程的实现和历史
  7. 做海外市场,如何在Facebook20多亿用户中分一杯羹?
  8. selenium python怎么断言_如何为python / selenium中的特定元素断言文本?
  9. 樊登36个问题建立亲密关系_36个问题建立亲密关系
  10. unity现代人物含代码动画_Unity Animation--动画系统概述
  11. ASP.Net中控件的EnableViewState属性 (转)
  12. 哒螨灵使用注意事项_哒螨灵怎么使用?哒螨灵的使用方法和注意事项
  13. 抗击疫情,程序员在家免费学这些!
  14. 微服务架构-ruoyi
  15. 【tools】信息收集-灯塔资产扫描 ARL
  16. JS(JQ)实现table表格固定表头且表头可以随横向滚动而滚动
  17. JavaWeb开发 —— HTML
  18. 如何通俗的理解函数的极限_(高等数学笔记)萌新也能理解的函数极限求法
  19. Python:flake8_E501_E128_E125
  20. fMRI数据处理_预处理_1_流程及脚本

热门文章

  1. android项目之山寨天天动听 — 前言
  2. JAVA_IO流的关闭两种方式
  3. leetcode、acwing蓝桥准备D1-5
  4. UP9616|UPI车充IC| QC3.0认证车充方案|兼容FCP/TypeC/BC1.2/Apple等协议
  5. 每天一个漏洞之——shiro反序列化
  6. indesign选中不了图片删除_公众号文章排版,如何让两张图片并排显示?
  7. Android逆向之雷速体育(360加固)
  8. 操作系统部分基础知识点手动整理
  9. OPPOReno4SE和realmex7pro哪个好
  10. 图论专题班连通性例题和练习