您的位置:首页 > 移动开发 > Android开发

Android Studio平台下使用hellochart实现从txt文件读取数据绘折线图

2018-11-12 11:27 218 查看

Android Studio平台下使用hellochart实现从文本读取数据绘折线图

本人是一个刚刚接触Android不超过两个月的小白,最近在做的论文是关于这一块的相关内容。所有的东西都是自学的,听导师的建议也是第一次留个这样的资料,可能有很多地方理解不到位,也欢迎大家给我更多的建议,让我学习进步。

首先先导入了一个第三方包:hellocharts-library-1.5.8.jar,目的是用来绘图。然后在res文件夹下新建raw文件夹,在raw文件夹内放入文本数据,我自己这里是a.txt

a.txt内是从串口接收到的数据再保存下来的,这一块因为是从学长那里接手的,目前还没太搞懂,留待以后解决。现在还是回来读取数据在绘折线图这一块。

/**
* 初始化表格设置
*/
private void initLineChart() {
Line line =new Line(mPointValues).setColor(Color.BLUE);//将数据点填充到线上,并设置线的颜色为蓝色
List<Line> lines = new ArrayList<Line>();          //创建了一个ArrayList对象;<>用于向参数化类
// 型传递参数;传递进入一个Line类型的变量作为参数,详细可见泛型
// List是Collection接口的子接口 List有一个重要的实现类--ArrayList类,List中的元素是有序排列的而且可重复,所以被称为是序列。
line.setShape(ValueShape.CIRCLE);                  //折线上每个数据点的形状,设置为圆形
line.setCubic(false);                               //曲线是否圆滑
line.setFilled(false);  //是否填充曲线的面积
line.setHasLabels(true);//曲线的数据坐标是否加上备注
line.setHasLabelsOnlyForSelected(true);//点击数据坐标提示数据(设置了这个line.setHasLabels(true);就无效)
line.setHasLines(true);//是否用线显示。如果为false 则没有曲线只有点显示
line.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示(每个数据点都是个大的圆点)

lines.add(line);//个人理解,将以上设置的 应用对象“line”的字段传给"lines"
LineChartData data = new LineChartData();
data.setLines(lines);//以上三行代码,均为导入折线的初始设置

//坐标轴
Axis axisX = new Axis();//创建X轴的引用变量
Axis axisY = new Axis();//Y轴

axisX.setName("道址数");
axisY.setName("计数");

data.setAxisXBottom(axisX);//X轴设置在底部
data.setAxisYLeft(axisY);//Y轴设置在左侧

//数据添加
data.setBaseValue(Float.NEGATIVE_INFINITY);
lineChart.setLineChartData(data);

//设置平行缩放等行为属性
lineChart.setInteractive(true);
lineChart.setZoomType(ZoomType.HORIZONTAL_AND_VERTICAL);//水平跟垂直方向上的放大
lineChart.setContainerScrollEnabled(true, ContainerScrollType.HORIZONTAL);
//上一行代码为设置水平方向可以滚动
lineChart.setVisibility(View.VISIBLE);

//动画效果
//         prepareDataAnimation();
lineChart.startDataAnimation(1000);

}

初始化表格属性完成之后,就是添加数据,具体代码如下:

/**
* 设置X 轴的显示
*/
private void getAxisXLables(){
for (int i = 0; i < Xdate.length; i++) {
mAxisXValues.add(new AxisValue(i).setLabel(Xdate[i]));
}
}
/**
* 图表的每个点的显示
*/
private void getAxisPoints() {
for (int i = 0; i < showdata.length; i++) {
mPointValues.add(new PointValue(i, showdata[i]));
}
}

最后是从文件中读取数据:

public  String getString (InputStream inputStream) {
InputStreamReader inputStreamReader = null;
try {
inputStreamReader = new InputStreamReader(inputStream, "gbk");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
BufferedReader reader = new BufferedReader(inputStreamReader);   //创建一个输入流
StringBuffer sb = new StringBuffer();
String line;

try {
while ((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\n");

}
} catch (IOException e) {
e.printStackTrace();

}

score=sb.toString();
return  sb.toString();
}
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<lecho.lib.hellocharts.view.LineChartView
android:id="@+id/chart_01"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</android.support.constraint.ConstraintLayout>

最后,整个Mainactivity.java放上来,里面有部分内容还在测试,是为后续的算法做的准备,例如HashMap这一块。

package com.example.administrator.exchangetype;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import lecho.lib.hellocharts.gesture.ContainerScrollType;
import lecho.lib.hellocharts.gesture.ZoomType;
import lecho.lib.hellocharts.model.Axis;
import lecho.lib.hellocharts.model.AxisValue;
import lecho.lib.hellocharts.model.Line;
import lecho.lib.hellocharts.model.LineChartData;
import lecho.lib.hellocharts.model.PointValue;
import lecho.lib.hellocharts.model.ValueShape;
import lecho.lib.hellocharts.view.LineChartView;

- public class MainActivity extends AppCompatActivity {
//折线图
private LineChartView lineChart;
private List<PointValue> mPointValues = new ArrayList<PointValue>();
private List<AxisValue> mAxisXValues = new ArrayList<AxisValue>();
static String score;
String[] Xdate=new String[1023];
int[] showdata=new int[1023];
int anum;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

lineChart = (LineChartView) findViewById(R.id.chart_01);

InputStream inputStream = getResources().openRawResource(R.raw.a);
getString(inputStream);

for (anum=0;anum<1023;anum++){
Xdate[anum]= anum+"";
}

String ss[] = score.split(" ");
byte scorechang[] = new byte[ss.length];

for (int i = 0; i < ss.length-1; i++) {
scorechang[i] = (byte) Integer.parseInt(ss[i],16);
showdata[i]=(int)scorechang[i];
}

//        tvtext.setText(scorechang.toString());            测试用

initLineChart();//初始化设置
getAxisPoints();//X轴的显示

//paixv
Map<String,Integer> map = new HashMap<>();

for(String str : ss ){
Integer num = map.get(str);
map.put(str,num == null ? 1 : num + 1);
}
Set set = map.entrySet();
Iterator it = set.iterator();

while (it.hasNext()){
Map.Entry<String,Integer> entry =(Map.Entry<String, Integer>)it.next();
System.out.println("单词 " + entry.getKey() + " 出现次数 : " + entry.getValue());
}
}

/**
* 初始化表格设置
*/
private void initLineChart() {
Line line =new Line(mPointValues).setColor(Color.BLUE);//将数据点填充到线上,并设置线的颜色为蓝色
List<Line> lines = new ArrayList<Line>();          //创建了一个ArrayList对象;<>用于向参数化类
// 型传递参数;传递进入一个Line类型的变量作为参数,详细可见泛型
// List是Collection接口的子接口 List有一个重要的实现类--ArrayList类,List中的元素是有序排列的而且可重复,所以被称为是序列。
line.setShape(ValueShape.CIRCLE);                  //折线上每个数据点的形状,设置为圆形
line.setCubic(false);                               //曲线是否圆滑
line.setFilled(false);  //是否填充曲线的面积
line.setHasLabels(true);//曲线的数据坐标是否加上备注
line.setHasLabelsOnlyForSelected(true);//点击数据坐标提示数据(设置了这个line.setHasLabels(true);就无效)
line.setHasLines(true);//是否用线显示。如果为false 则没有曲线只有点显示
line.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示(每个数据点都是个大的圆点)

lines.add(line);//个人理解,将以上设置的 应用对象“line”的字段传给"lines"
LineChartData data = new LineChartData();
data.setLines(lines);//以上三行代码,均为导入折线的初始设置

//坐标轴
Axis axisX = new Axis();//创建X轴的引用变量
Axis axisY = new Axis();//Y轴

axisX.setName("道址数");
axisY.setName("计数");

data.setAxisXBottom(axisX);//X轴设置在底部
data.setAxisYLeft(axisY);//Y轴设置在左侧

//数据添加
data.setBaseValue(Float.NEGATIVE_INFINITY);
lineChart.setLineChartData(data);

//设置平行缩放等行为属性
lineChart.setInteractive(true);
lineChart.setZoomType(ZoomType.HORIZONTAL_AND_VERTICAL);//水平跟垂直方向上的放大
lineChart.setContainerScrollEnabled(true, ContainerScrollType.HORIZONTAL);
//上一行代码为设置水平方向可以滚动
lineChart.setVisibility(View.VISIBLE);

//动画效果
//         prepareDataAnimation();
lineChart.startDataAnimation(1000);

}

/**
* 图表的每个点的显示
*/
private void getAxisPoints() {
for (int i = 0; i < showdata.length; i++) {
mPointValues.add(new PointValue(i, showdata[i]));
}
}

/**
* 设置X 轴的显示
*/
private void getAxisXLables(){
for (int i = 0; i < Xdate.length; i++) {
mAxisXValues.add(new AxisValue(i).setLabel(Xdate[i]));
}
}public  String getString (InputStream inputStream) {
InputStreamReader inputStreamReader = null;
try {
inputStreamReader = new InputStreamReader(inputStream, "gbk");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
BufferedReader reader = new BufferedReader(inputStreamReader);   //创建一个输入流
StringBuffer sb = new StringBuffer();
String line;

try {
while ((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\n");

}
} catch (IOException e) {
e.printStackTrace();

}

score=sb.toString();
return  sb.toString();
}
}

我使用的Android Studio版本是3.1.2,Gradle版本4.4,使用Android 8.0,华为mate8真机与模拟器都进行过测试。文件放在网盘:https://pan.baidu.com/s/114jzmu3mp5pvwGON3OlQVg

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐