先废话一下:来到公司之前,项目是由外包公司做的,面试初,没有接触过分时图k线这块,觉得好难,我能搞定不!但是一段时间之后,发现之前做的那是一片稀烂,但是这货是主功能啊,迟早的自己操刀,痛下决心,开搞,本想用开源控件,但是想自己实现一下:接着有了本文
开始用surfaceview,但是这货在上下滑动的时候会出现黑边,这个问题我也是纠结了好久,想想产品肯定会打回,打回了还丢脸,算了没多少东西就用view吧,废话真tm多,开始吧。
1,创建项目(Android studio)
2,对了,先上个效果图吧,节省各位的时间:
3,把Activity设置为横屏,不设置也无所谓,我觉得横屏的好看点
android:screenOrientation="landscape"
4,建俩基类分时图点数据和K线每点的数据,备注的很清楚了
/**
* 分时所需要的 数据字段
*/
public class CMinute {
//时间
public long time;
//最新价
public double price;
//交易量
public long count;
//均价
public double average ;
//涨跌幅
public double rate ;
//价格
public double money ;
public long getTime() {
return time;
}
public String getTimeStr() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
try {
return sdf.format(new Date(time * 1000));
} catch (Exception e) {
return "--:--";
}
}
}
public class StickData implements Parcelable {
//时间
private long time;
//开盘
private double open;
//收盘
private double close;
//最高
private double high;
//最低
private double low;
//量
private long count;
//昨收
private double last;
//涨跌幅
private double rate;
//价格
private double money;
//计算均线的零时保存的值
private double maValue;
//5段均线
private double sma5;
//10段均线
private double sma10;
//20段均线
private double sma20;
//量5段均线
private double countSma5;
//量10段均线
private double countSma10;
//MACD的三个参数
private double dif;//线
private double dea;//线
private double macd;//柱状
//KDJ的三根线
private double k;
private double d;
private double j;
//计算K时需要
private double rsv;
//K线资金
//超大单净值
private double sp;
//大单净值
private double bg;
//中单净值
private double md;
//小单净值
private double sm;
5,画图的步骤
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//1,初始化需要的数据
initWidthAndHeight();
//2,画网格
drawGrid(canvas);
//3,画线(分时线的价格线、均价线或K线的均线)
drawLines(canvas);
if(lineType != TYPE_FENSHI) {
//4,如果是K线另外画烛形图
drawCandles(canvas);
}
//5,写上XY轴的文字(写早了会被覆盖)
drawText(canvas);
//6,画需要显示的指标
switch (indexType) {
case INDEX_VOL:
drawVOL(canvas);
break;
case INDEX_ZJ:
drawZJ(canvas);
break;
case INDEX_MACD:
drawMACD(canvas);
break;
case INDEX_KDJ:
drawKDJ(canvas);
break;
}
}
6,画图实现
其实分时线就是画线,烛形图也是画线,但是多画个矩形而已,要是分析成这样的话,就简单学多了,那么接下来我来教你画线画矩形。。。。
此处省略10000字,好了说完了(其实是不用说了,就那么俩方法drawLine,drawRect),接下来我们重点说说位置的计算:
我们实际拿到的数据,不可能直接展示到坐标系的,因为可能很大很小,先来说说Y轴吧
Y轴
y = height - input * height / (max - min);
y:计算结果
height:view高度
max:显示的一组数据最大值
min:显示的一组数据中最小值
展示分时线时,需要在均价和价格取出最大值和最小值