package com.moral.chartdemo;
|
|
import android.graphics.Color;
|
import android.support.v7.app.AppCompatActivity;
|
import android.os.Bundle;
|
import android.view.View;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Random;
|
import java.util.Timer;
|
import java.util.TimerTask;
|
|
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.model.Viewport;
|
import lecho.lib.hellocharts.view.LineChartView;
|
|
public class MainActivity extends AppCompatActivity {
|
private LineChartView lineChart;
|
Random random;
|
Line line;
|
LineChartData data;
|
Axis axisX;
|
private List<PointValue> mPointValues = new ArrayList<PointValue>();
|
private List<AxisValue> mAxisXValues = new ArrayList<AxisValue>();
|
private List<AxisValue> mAxisYValues = new ArrayList<AxisValue>();
|
|
private Timer timer;
|
@Override
|
protected void onCreate(Bundle savedInstanceState) {
|
super.onCreate(savedInstanceState);
|
setContentView(R.layout.activity_main);
|
lineChart = (LineChartView) findViewById(R.id.chart);
|
random = new Random();
|
getAxisPoints();//获取坐标点
|
initLineChart();//初始化
|
|
showChangeLineChart();
|
}
|
|
/**
|
* 设置X 轴的显示
|
*/
|
private void getAxisXLables(){
|
// for (int i = 0; i < date.length; i++) {
|
// mAxisXValues.add(new AxisValue(i).setLabel(date[i]));
|
// }
|
} /**
|
* 设置Y轴的显示
|
*/
|
private void getAxisYLables(){
|
for(int i = 0; i < 100; i++){
|
AxisValue value = new AxisValue(i);
|
String label = ""+i;
|
value.setLabel(label);
|
mAxisYValues.add(value);
|
}
|
|
}
|
/**
|
* 图表的每个点的显示
|
*/
|
private void getAxisPoints() {
|
// for (int i = 0; i < score.length; i++) {
|
// mPointValues.add(new PointValue(i, score[i]));
|
// }
|
}
|
private void initLineChart() {
|
line = new Line(mPointValues).setColor(Color.parseColor("#FFCD41")); //折线的颜色(橙色)
|
List<Line> lines = new ArrayList<Line>();
|
line.setShape(ValueShape.CIRCLE);//折线图上每个数据点的形状 这里是圆形 (有三种 :ValueShape.SQUARE ValueShape.CIRCLE ValueShape.DIAMOND)
|
line.setCubic(true);//曲线是否平滑,即是曲线还是折线
|
line.setFilled(false);//是否填充曲线的面积
|
line.setHasLabels(true);//曲线的数据坐标是否加上备注
|
// line.setHasLabelsOnlyForSelected(true);//点击数据坐标提示数据(设置了这个line.setHasLabels(true);就无效)
|
line.setHasLines(true);//是否用线显示。如果为false 则没有曲线只有点显示
|
line.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示(每个数据点都是个大的圆点)
|
lines.add(line);
|
data = new LineChartData();
|
data.setLines(lines);
|
|
//坐标轴
|
axisX = new Axis(); //X轴
|
axisX.setHasTiltedLabels(false); //X坐标轴字体是斜的显示还是直的,true是斜的显示
|
axisX.setTextColor(Color.WHITE); //设置字体颜色
|
axisX.setName("时间"); //表格名称
|
axisX.setTextSize(10);//设置字体大小
|
axisX.setTextColor(Color.GRAY);
|
// axisX.setMaxLabelChars(7); //最多几个X轴坐标,意思就是你的缩放让X轴上数据的个数7<=x<=mAxisXValues.length
|
axisX.setValues(mAxisXValues); //填充X轴的坐标名称
|
data.setAxisXBottom(axisX); //x 轴在底部
|
//data.setAxisXTop(axisX); //x 轴在顶部
|
axisX.setHasLines(true); //x 轴分割线
|
|
// Y轴是根据数据的大小自动设置Y轴上限(在下面我会给出固定Y轴数据个数的解决方案)
|
Axis axisY = Axis.generateAxisFromRange(0,100,1); //Y轴
|
axisY.setAutoGenerated(false);
|
axisY.setHasLines(true);
|
axisY.setName("数据");//y轴标注
|
axisY.setTextSize(10);//设置字体大小
|
axisX.setTextColor(Color.GRAY);
|
// axisY.setValues(mAxisYValues);
|
data.setAxisYLeft(axisY); //Y轴设置在左边
|
//data.setAxisYRight(axisY); //y轴设置在右边
|
|
|
//设置行为属性,支持缩放、滑动以及平移
|
lineChart.setInteractive(true);
|
lineChart.setZoomType(ZoomType.HORIZONTAL);
|
lineChart.setMaxZoom((float) 2);//最大方法比例
|
lineChart.setContainerScrollEnabled(true, ContainerScrollType.HORIZONTAL);
|
lineChart.setLineChartData(data);
|
lineChart.setVisibility(View.VISIBLE);
|
|
/**注:下面的7,10只是代表一个数字去类比而已
|
* 当时是为了解决X轴固定数据个数。见(http://forum.xda-developers.com/tools/programming/library-hellocharts-charting-library-t2904456/page2);
|
*/
|
lineChart.setCurrentViewport(initViewPort(0,7));
|
lineChart.startDataAnimation();
|
}
|
|
|
/**
|
* 这个是模拟实时获取数据的一个计时器,大家可以根据实际情况修改
|
*/
|
private boolean isFinish = false;
|
private int index = 0;
|
private void showChangeLineChart() {
|
timer = new Timer();
|
timer.schedule(new TimerTask() {
|
@Override
|
public void run() {
|
if(!isFinish){
|
mPointValues.add(new PointValue(index,random.nextInt(100)));
|
mAxisXValues.add(new AxisValue(index).setLabel(index+""));
|
if(mPointValues.size()>7){
|
mPointValues.remove(0);
|
}
|
if(mAxisXValues.size()>7){
|
mAxisXValues.remove(0);
|
}
|
// axisX.setMaxLabelChars(10);
|
axisX.setValues(mAxisXValues);
|
data.setAxisXBottom(axisX);
|
// line.setValues(null);
|
line.setValues(mPointValues);
|
List<Line> lines = new ArrayList<Line>();
|
lines.add(line);
|
data.setLines(lines);
|
lineChart.setLineChartData(data);
|
index++;
|
// int dx = mAxisXValues.size();
|
// if(dx<7){
|
// lineChart.setCurrentViewport(initViewPort(0,7));
|
// }else{
|
// lineChart.setCurrentViewport(initViewPort((dx/7-1)*7+dx%7,dx));
|
// }
|
|
}
|
}
|
},1000,2000);
|
}
|
|
private Viewport initViewPort(float left, float right) {
|
Viewport port = new Viewport();
|
port.left = left;
|
port.right = right;
|
return port;
|
}
|
}
|