之前很少写技术博客一方面是怕自己的技术不到家,把大家带到坑里;另一方面就是自己太懒了。现在鼓起勇气把自己的心得体会以及项目的实现思路展现给大家。希望和大家一起学习一起进步!
下面说一下此次实现的主要功能:
1. 展示指标的图表:MA,VOL,MACD,KDJ;
2. 实现股票的十字线功能,以及当天股票详情信息框的展示;
3. 手势:
1> 单击实现展示十字线和当天股票详情信息框,再次点击消失;
2> 在不出现十字线的情况下,单指滑动屏幕实现图表的滚动;
3> 实现双指的缩放;
4> 实现上下图表的联动,上下图表同时滚动;
废话不多说,按照惯例首先展示程序运行结果:上面组图展示的分别是:
第一幅:为K线图和成交量图(VOL);第二幅:K线图和MACD图;第三幅:K线图和KDJ图表;
如果感觉还可以的话记得给我点个赞,很辛苦的好吧!谢谢大家!
-------------------------------------------------------------------------------------------------------------------
好了言归正传,本篇博客主要是数据的获取以及解析:
首先获取网络数据:
接口服务器提供的是XML的数据格式,需要使用XML的相关解析方式;在这里使用的是PULL解析。
思路:
使用的是HttpURLConnection使用GET的方式建立网络的连接获取信息流InputStream,下一步就是利用平PULL解析,解析网络获取的数据,并将解析的数据封装到之前定义的股票对象中。
下面是代码片段:
/**
* 从网络获取数据
*
* @return InputStream
*/
private InputStream getData() {
InputStream is = null;
HttpURLConnection conn = null;//创建网络链接对象
try {
URL u = new URL("API数据接口");//创建url对象
conn = (HttpURLConnection) u.openConnection();//创建网络链接对象
conn.setRequestMethod("GET");//设置网络请求方式;
conn.setDoInput(true);//允许输入流,下载;
conn.setUseCaches(false);
conn.setConnectTimeout(5000);//设置网络连接时间
int code = conn.getResponseCode();//获取网络请求的响应码;
Log.i("tag", "ParserUtil..code:" + code);
if (code == 200) {//说明网络请求成功
is = conn.getInputStream();//获取文件的输入流
}
} catch (Exception e) {
e.printStackTrace();
}
return is;//返回流
}
/**
* PULL解析从网络获取的数据
*
* @return List
*/
public List
parserData() {
//创建XmlPullParser 实例
XmlPullParser xpp = Xml.newPullParser();
InputStream mInputStream = getData();
try {
//设置输入流并标明编码方式
if (mInputStream != null){
xpp.setInput(mInputStream, "UTF-8");
//产生第一个事件
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT: //判断当前事件是否为开始事件
mList = new ArrayList
();//初始化集合
break;
case XmlPullParser.START_TAG://判断但前事件是否为标签元素的开始事件
if (xpp.getName().equals("data")) {// 判断开始标签元素是否是data
stockInfo = new StockInfo();//初始化对象
} else if (xpp.getName().equals("date")) {//date
eventType = xpp.next();//让解析器指向date属性的值
stockInfo.setDate(xpp.getText());//date赋值
} else if (xpp.getName().equals("open")) {//open
eventType = xpp.next();//让解析器指向open属性的值
stockInfo.setOpen(Float.valueOf(xpp.getText()));//open赋值
} else if (xpp.getName().equals("close")) {//close
eventType = xpp.next();//让解析器指向close属性的值
stockInfo.setClose(Float.valueOf(xpp.getText()));//close赋值
} else if (xpp.getName().equals("high")) {//high
eventType = xpp.next();//让解析器指向high属性的值
stockInfo.setHigh(Float.valueOf(xpp.getText()));//high赋值
} else if (xpp.getName().equals("low")) {//low
eventType = xpp.next();//让解析器指向low属性的值
stockInfo.setLow(Float.valueOf(xpp.getText()));//low赋值
} else if (xpp.getName().equals("volume")) {//volume
eventType = xpp.next();//让解析器指向volume属性的值
stockInfo.setVolume(xpp.getText());//volume赋值
} else if (xpp.getName().equals("turnover")) {//turnover
eventType = xpp.next();//让解析器指向turnover属性的值
stockInfo.setTurnover(xpp.getText());//turnover赋值
}
break;
case XmlPullParser.END_TAG://判断当前事件是否为标签元素结束事件
if (xpp.getName().equals("data")) {// 判断开始标签元素是否是data
mList.add(stockInfo);//对象添加进集合
stockInfo = null;
}
break;
}
// 进入下一个元素并触发相应事件
eventType = xpp.next();
}
return mList;
}
return null;
} catch (Exception e) {
e.printStackTrace();
} finally {
// Log.i("tag", "ParserUtil..mlist:" + mList.size() + getTime());
}
return null;
}
下一篇博客将会讲述:相关指标的含义以及计算,敬请期待!