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 mPointValues = new ArrayList(); private List mAxisXValues = new ArrayList(); private List mAxisYValues = new ArrayList(); 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 lines = new ArrayList(); 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 lines = new ArrayList(); 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; } }