android 股票行情界面,Android版的股票行情K线图开发
转载请注明出住:http://blog.csdn.net/andywuchuanlong
现在在手上的是一个证券资讯类型的app,其中有涉及到股票行情界面,行情中有K线图等,看到网上很多人在求这方面的资料,所以我特地写了一个demo在此处给大家分享一下。
下面是做出来的效果图:
这个 界面 是如何画出来的我就不做介绍了,大家可以去下载项目源码。
背景图是利用canvas先画出一个矩形,然后再画几根虚线,均线图是通过path来绘制的,总之图的绘制是很简单的,我就不在这里作介绍了,大家可以去github下载源码看看。涉及到均线、最高价、最低价、收盘价、开盘价的概念大家可以百度一下。
我再这里要介绍的是计算问题:
大家可以看到分时图、日K、月K的左边的成交价格都是不一样的,而我们的k线都是通过这个价格来绘制的,也就是说价格是时刻变动,那么我们的k线绘制也是变动的。假设我们要计算分时图中价格为25.69的那一分钟应该如何画,画在屏幕中的哪一个位置,那么这个应该怎么画呢,价格是变动的,画的位置也是变动的,但是有一点我们屏幕的大小是不变的。所以我们可以通过背景图的高度来计算某个价格的线图应该从哪个地方开始画。我们可以计算出一个像素点对应多少个价格,分析图如下:
价格和像素形成个一个比例计算是:double heightScale = (endY - startY)/(highPrice - lowPrice);
所以价格25.69应该是画在mStartY = (float) (startY+ (highPrice - 25.69) * heightScale);
这个明白了之后其他的原理都是一样的,我就不介绍了,下面是部分代码:
@Override
protected void drawKChatBackGround() {
Rect dirty = new Rect(left, kChartTop, right, KChartbottom);
// 画背景图的矩形
mCanvas.drawRect(dirty, LineGrayPaint);
PathEffect effects = new DashPathEffect(new float[] { 5, 5, 5, 5 }, 1);
LineGrayPaint.setPathEffect(effects);
Path path = new Path();
int y = kChartTop + 15;
// 画上面的虚线
path.moveTo(left, y );
path.lineTo(right, y );
String text = getPriceText(highPrice);
int textHeight = (int) (textGrayPaint.descent() - textGrayPaint.ascent());
mCanvas.drawText(text,left - textGrayPaint.measureText(text) - 5,y + textHeight/2 ,textGrayPaint);
double max = highPrice - lowPrice;
if (max > 10){
// 分成四等分
// 画中间的三根虚线
int n = 4;
double sper = (highPrice - lowPrice) / 4;// 每一等分代表的价格
for(int i=1;i
y = i*((KChartbottom - kChartTop)/n) + kChartTop;
path.moveTo(left, y);
path.lineTo(right,y);
text = getPriceText(highPrice - i*sper);
mCanvas.drawText(text,left - textGrayPaint.measureText(text) - 5,y + textHeight/2,textGrayPaint);
}
}else{
// 分成两等分
// 画中间的虚线
y = (KChartbottom - kChartTop)/2 + kChartTop;
path.moveTo(left, y);
path.lineTo(right, y);
text = getPriceText(highPrice - (highPrice - lowPrice) / 2);
mCanvas.drawText(text,left - textGrayPaint.measureText(text) - 5,y + textHeight/2,textGrayPaint);
}
// 画下面的虚线
y = KChartbottom - 15;
path.moveTo(left, y);
path.lineTo(right, y);
text = getPriceText(lowPrice);
mCanvas.drawText(text,left - textGrayPaint.measureText(text) - 5,y + textHeight/2,textGrayPaint);
画等分的虚线和下面的日期
for (int i = num - 1; i > 0; i--) {
int x = left + perWidth * i;
path.moveTo(x, kChartTop);
path.lineTo(x, KChartbottom);
perXPoint[i - 1] = x;
}
mCanvas.drawPath(path, LineGrayPaint);
}
@Override
protected void drawMAChart() {
// 画均线
Path path5 = new Path();
Path path10 = new Path();
Path path20 = new Path();
double heightScale = (KChartbottom - kChartTop)/(highPrice - lowPrice);
int maStart = left;
float maStartY;
path5.moveTo(maStart, (float) (kChartTop + (highPrice - infos.get(0).getMaValue5()) * heightScale));
path10.moveTo(maStart, (float) (kChartTop + (highPrice - infos.get(0).getMaValue10()) * heightScale));
path20.moveTo(maStart, (float) (kChartTop + (highPrice - infos.get(0).getMaValue20()) * heightScale));
for(SingleStockInfo info:infos){
maStart += per * perHalf;// 每一天实际所占的数据是4/6,左右边距各1/6
maStartY = (float) (kChartTop + (highPrice - info.getMaValue5()) * heightScale);
path5.lineTo(maStart, maStartY);
maStartY = (float) (kChartTop + (highPrice - info.getMaValue10()) * heightScale);
path10.lineTo(maStart, maStartY);
maStartY = (float) (kChartTop + (highPrice - info.getMaValue20()) * heightScale);
path20.lineTo(maStart, maStartY);
maStart += per * perHalf;
}
Paint paint = new Paint();
paint.setColor(Color.BLUE);
paint.setAntiAlias(true);
paint.setStrokeWidth(2);
paint.setStyle(Style.STROKE);
mCanvas.drawPath(path5, paint);
paint.setColor(Color.MAGENTA);
mCanvas.drawPath(path10, paint);
paint.setColor(Color.GREEN);
mCanvas.drawPath(path20, paint);
}
/**
* 下面的柱形图
*/
@Override
protected void drawPillarsChart(int flag) {
LineGrayPaint.setPathEffect(null);
Rect dirty = new Rect(left, pillarsChartTop, right, pillarsChartbottom);
// 画背景图的矩形
mCanvas.drawRect(dirty, LineGrayPaint);
int y = pillarsChartTop + (pillarsChartbottom - pillarsChartTop)/2;
mCanvas.drawLine(left,y,right, y, LineGrayPaint);
// 中间的值
String totalCount = getPriceText(maxCount/2/10000);
float maginLeft = left - textGrayPaint.measureText(totalCount)- 5;
mCanvas.drawText(totalCount, maginLeft, y,textGrayPaint);
// 上面的值
totalCount = getPriceText(maxCount/10000);
maginLeft = left - textGrayPaint.measureText(totalCount)- 5;
mCanvas.drawText(totalCount, maginLeft, pillarsChartTop,textGrayPaint);
// 下面的值
totalCount = "万手";
maginLeft = left - textGrayPaint.measureText(totalCount) - 5;
mCanvas.drawText(totalCount, maginLeft, pillarsChartbottom,textGrayPaint);
int pStart = left;
float pStartY;
double heightScale = (pillarsChartbottom - pillarsChartTop)/maxCount;
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
if (flag == StockService.FLAG){
for(MinuteInfo info:minuteInfos){
pStart += per * per16;// 每一天实际所占的数据是4/6,加上1/6
pStartY = (float) (pillarsChartTop + (maxCount - info.getVolume()) * heightScale);
dirty = new Rect(pStart, (int) pStartY, (int) (pStart + per * per46), pillarsChartbottom-2);
paint.setColor(info.getColor());
// 画背景图的矩形
mCanvas.drawRect(dirty, paint);
pStart += per * per56;// 右边的间距 5/6
}
}else{
for(SingleStockInfo info:infos){
pStart += per * per16;// 每一天实际所占的数据是4/6,加上1/6
pStartY = (float) (pillarsChartTop + (maxCount - info.getTotalCount()) * heightScale);
dirty = new Rect(pStart, (int) pStartY, (int) (pStart + per * per46), pillarsChartbottom-2);
paint.setColor(info.getColor());
// 画背景图的矩形
mCanvas.drawRect(dirty, paint);
pStart += per * per56;// 右边的间距 5/6
}
}
}
/**
* 分时图
*/
@Override
public void drawHoursChart(){
double heightScale = (KChartbottom - kChartTop)/(highPrice - lowPrice);
int cLeft = left;
int cTop = 0;
Path path = new Path();
path.moveTo(cLeft, KChartbottom-2);
int position = 0;
int perPointX = perXPoint[position];// 记录第一条垂直虚线的x坐标
for(MinuteInfo info:minuteInfos){
cLeft += per * per16;
cTop = (int) (kChartTop + (highPrice - info.getNow()) * heightScale);
path.lineTo(cLeft + per * per26, cTop);
if (cLeft >= perPointX){
// 恰好画到第一条垂直虚线的地方,需要画下面的时间
String text = KChartUtil.getMinute(info.getMinute());
float textWidth = textGrayPaint.measureText(text);
int textHeight = (int) (textGrayPaint.descent()- textGrayPaint.ascent());
mCanvas.drawText(text, perPointX - textWidth/2, KChartbottom + textHeight, textGrayPaint);
if (!(position == perXPoint.length-1)){
Log.e(TAG, perPointX+"----------"+info.getMinute()+"---"+text);
perPointX = perXPoint[++position];
}
}
cLeft += per * per56;// 右边的间距 5/6
}
path.lineTo(cLeft, KChartbottom-2);
Paint LinePaint = new Paint();
LinePaint.setColor(Color.BLUE);
LinePaint.setAntiAlias(true);
LinePaint.setStrokeWidth(1);
LinePaint.setStyle(Style.STROKE);
//LinePaint.setStyle(Style.STROKE);
mCanvas.drawPath(path, LinePaint);
LinePaint.setAlpha(50);
LinePaint.setStyle(Style.FILL);
mCanvas.drawPath(path, LinePaint);
}
android 股票行情界面,Android版的股票行情K线图开发相关推荐
- StockChart Android股票图/K线图开发库
项目地址:GitHub 一.介绍 StockChart 一款适用于Android的高扩展性.高性能股票图/K线图开发库,支持多图组合,除了使用内置子图还支持定制子图满足复杂的业务需求. 特点 内置子图 ...
- android开发最新行情,Android版的股票行情K线图开发
现在在手上的是一个证券资讯类型的app,其中有涉及到股票行情界面,行情中有K线图等,看到网上很多人在求这方面的资料,所以我特地写了一个demo在此处给大家分享一下. 下面是做出来的效果图: 背景图是利 ...
- android 股票 开发,Android版的股票行情K线图开发
现在在手上的是一个证券资讯类型的app,其中有涉及到股票行情界面,行情中有K线图等,看到网上很多人在求这方面的资料,所以我特地写了一个demo在此处给大家分享一下. 下面是做出来的效果图: 这个 界面 ...
- 量化投资学习-5:股票与美女5-美女的容貌:K线图
股票的K线图,就是股票的价格走势图. 股票的价格走势图,就像美女的容貌,有漂亮的,也有平常的,也有丑的. 漂亮的容貌,有些是天生丽质,有些是靠化妆化出来的. 股票漂亮的K线图也一样, 1. 有些是优质 ...
- 使用 Python 生成股票 K 线图
引言 在股票分析中,经常需要用到 K 线图来分析股票的价格波动情况和交易量情况.本文将介绍如何使用 Python 和 pyecharts 库生成股票 K 线图,并将其保存为 HTML 文件. 准备数据 ...
- Android版股票K线图实现方案
前言 本文将介绍股票K线图的实现方案,项目名为KLineChart,github地址https://github.com/zengzg/KLineChart. 介绍 K线图一般分为日K.周K.月K,显 ...
- Android股票K线图
前言:对KLineChart仿火币K线图进行删减以及扩展,如需参看原项目地址点击此处 1.效果图 2.代码部分: base包: /*** 数据适配器*/ public interface IAdapt ...
- python绘制k线图的步骤_Python使用PyQtGraph绘制股票行情K线图
PyQtGraph是Python平台上一种功能强大的2D/3D绘图库,相对于matplotlib库,由于其在内部实现方式上,使用了高速计算的numpy信号处理库以及Qt的GraphicsView框架, ...
- python股票交易接口实现股票分时图K线图及抓取level2行情的开发程序分析
大家对股票交易接口并不陌生,那么要想获取股票数据获取,也是可以通过python股票交易接口实现股票分时图K线图及抓取level2行情的开发程序分析如下: import sys from PyQt5 i ...
最新文章
- 这 4 款 MySQL 调优工具 yyds
- HDU 5226 Tom and matrix(组合数学+Lucas定理)
- 网络游戏服务器端架构设计(转载)
- 吴恩达深度学习课程deeplearning.ai课程作业:Class 2 Week 1 2.Regularization
- solr快速入门的地址,spring-data/solr
- matlab拟合四次函数表达式,用matlab编写程序求以幂函数作基函数的3次、4次多项式的最小二乘曲线拟合,画出数据散点图及拟合曲线图...
- Linux基础(存储结构和磁盘划分)
- 二级计算机access押题,全国计算机等级考试标准教程:二级Access
- Flask笔记-任务框架搭建
- 开源GIS(十)——openlayers中加载在线标准与自定义切片
- SQLite数据库安装(windows)
- iPhone/iPad/Android UI尺寸规范
- 51单片机利用STC-ISP下载软件时串口打开失败怎么办?
- 用chatgpt做ppt
- cad2020卸载工具_2020年您应该拥有的12个自由职业者设计工具
- Lua阿拉伯数字转中文大写数字
- 修复迅雷看看xmp.rmvb视频文件错误关联
- Wordpress免费建站图文教程(二):建站虚拟主机的购买
- 二极管在电路设计中的应用
- 仅需1秒!搞定100万行数据:超强Python数据分析利器!掌握了吗!
热门文章
- MSA多序列比对(multiple sequence alignment)
- 常用单电源运放的偏置方法
- oracle 日期改字符格式_Oracle时间转换成字符串
- 前端ui框架layui——layer弹出层-弹出框方法
- Android 集成百度地图之申请TTS授权最新版
- go语言 使用MTP协议 通过WPD(windows portable device)读取便携式设备信息并进行文件传输
- Windows计算机与便携式显示器
- cn.sample.mnn.detect A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid
- android公司 年终总结,Android小白之2017年终总结
- AE制作全息风扇视频制作笔记