package com.moral.screen.activity; import android.app.AlertDialog; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.annotation.IdRes; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.RadioGroup; import android.widget.TextView; import com.lzy.okgo.cache.CacheMode; import com.moral.andbrickslib.utils.FastJsonTools; import com.moral.andbrickslib.utils.NumberUtils; import com.moral.andbrickslib.utils.TimeUtil; import com.moral.screen.R; import com.moral.screen.base.BaseActivity; import com.moral.screen.common.API; import com.moral.screen.httputils.HttpCallBack; import com.moral.screen.model.SensorData; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Timer; import java.util.TimerTask; import lecho.lib.hellocharts.formatter.AxisValueFormatter; import lecho.lib.hellocharts.formatter.LineChartValueFormatter; import lecho.lib.hellocharts.formatter.SimpleAxisValueFormatter; import lecho.lib.hellocharts.formatter.SimpleLineChartValueFormatter; 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; /** * Created by haijiang on 2017/7/13. */ public class ChartActivity extends BaseActivity { private LineChartView chartView; Line line; LineChartData data; Axis axisX; Axis axisY; private List mPointValues = new ArrayList<>(); private List mAxisXValues = new ArrayList<>(); private TextView tv_sub,tv_unit; private String sensorKey, mac, name, unit; private float maxValue; private Timer timer; /** * 计时器 */ private boolean isFinish = false; private void showChangeLineChart() { timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { if(!isFinish){ getData(1,false); } } },0,5*1000); } @Override protected void getBundleExtras(Bundle extras) { sensorKey = getIntent().getStringExtra("sensorKey"); mac = getIntent().getStringExtra("mac"); name = getIntent().getStringExtra("name"); unit = getIntent().getStringExtra("unit"); maxValue = getIntent().getFloatExtra("maxValue", 0); } @Override protected int getLayoutId() { return R.layout.ac_charts_layout; } @Override protected void initViews() { initTopBar(); tv_title.setText("动态走势"); tv_sub = findView(R.id.tv_sub); tv_unit = findView(R.id.tv_unit); tv_sub.setText(name + "动态走势图"); tv_unit.setText("单位:" + unit); chartView = findView(R.id.chart); initLineChart(); } @Override protected void initListener() { } @Override protected void initData() { getData(8,true); showChangeLineChart(); } @Override protected void processClick(View view) { switch (view.getId()) { case R.id.tv_left: finish(); break; } } @Override protected void onErrorPageClick() { } private void initLineChart() { line = new Line(mPointValues).setColor(Color.parseColor("#ffffff")); //折线的颜色 List lines = new ArrayList<>(); line.setShape(ValueShape.CIRCLE);//折线图上每个数据点的形状 这里是圆形 (有三种 :ValueShape.SQUARE ValueShape.CIRCLE ValueShape.DIAMOND) line.setPointColor(Color.parseColor("#ffffff")); line.setCubic(false);//曲线是否平滑,即是曲线还是折线 line.setFilled(false);//是否填充曲线的面积 line.setHasLabels(true);//曲线的数据坐标是否加上备注 // line.setHasLabelsOnlyForSelected(true);//点击数据坐标提示数据(设置了这个line.setHasLabels(true);就无效) line.setHasLines(true);//是否用线显示。如果为false 则没有曲线只有点显示 line.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示(每个数据点都是个大的圆点) LineChartValueFormatter chartValueFormatter = new SimpleLineChartValueFormatter(1); line.setFormatter(chartValueFormatter);//显示小数点 lines.add(line); data = new LineChartData(); data.setLines(lines); data.setValueLabelBackgroundColor(Color.TRANSPARENT);//此处设置坐标点旁边的文字背景 data.setValueLabelBackgroundEnabled(false); data.setValueLabelsTextColor(Color.WHITE); data.setValueLabelTextSize(8); //坐标轴 axisX = new Axis(); //X轴 axisX.setHasTiltedLabels(false); //X坐标轴字体是斜的显示还是直的,true是斜的显示 axisX.setName("实时数据"); //表格名称 axisX.setTextSize(8);//设置字体大小 axisX.setTextColor(getResources().getColor(R.color.blue_txt)); // axisX.setMaxLabelChars(7); //最多几个X轴坐标,意思就是你的缩放让X轴上数据的个数7<=x<=mAxisXValues.length axisX.setValues(mAxisXValues); //填充X轴的坐标名称 axisX.setHasLines(true); //x 轴分割线 axisX.setLineColor(getResources().getColor(R.color.blue_txt)); axisX.setHasSeparationLine(true); data.setAxisXBottom(axisX); //x 轴在底部 //data.setAxisXTop(axisX); //x 轴在顶部 // Y轴是根据数据的大小自动设置Y轴上限(在下面我会给出固定Y轴数据个数的解决方案) axisY = Axis.generateAxisFromRange((float) 0.0, maxValue == 0 ? 100 : maxValue, maxValue == 0 ? 10 : maxValue / 16); //Y轴 // axisY = new Axis(); axisY.setAutoGenerated(false); // AxisValueFormatter yvalue = new SimpleAxisValueFormatter(1); // axisY.setFormatter(yvalue); axisY.setHasLines(true); axisY.setHasSeparationLine(true); axisY.setName(" ");//y轴标注 axisY.setTextSize(8);//设置字体大小 axisY.setTextColor(getResources().getColor(R.color.blue_txt)); axisY.setLineColor(getResources().getColor(R.color.blue_txt)); data.setAxisYLeft(axisY); //Y轴设置在左边 //设置行为属性,支持缩放、滑动以及平移 chartView.setInteractive(true); chartView.setZoomType(ZoomType.HORIZONTAL); chartView.setMaxZoom((float) 2);//最大方法比例 chartView.setContainerScrollEnabled(true, ContainerScrollType.HORIZONTAL); chartView.setLineChartData(data); chartView.setVisibility(View.VISIBLE); /**注:下面的7,10只是代表一个数字去类比而已 * 当时是为了解决X轴固定数据个数。见(http://forum.xda-developers.com/tools/programming/library-hellocharts-charting-library-t2904456/page2); */ final Viewport v = new Viewport(chartView.getMaximumViewport()); v.bottom = (float) 0.0; v.top = maxValue; chartView.setMaximumViewport(v); chartView.setCurrentViewport(v); } private int index = 0; private void reshowChart(final SensorData sensorData) { chartView.post(new Runnable() { @Override public void run() { mPointValues.add(new PointValue(index, sensorData.getValue())); mAxisXValues.add(new AxisValue(index).setLabel(index + "")); if(mPointValues.size()>8){ mPointValues.remove(0); } if(mAxisXValues.size()>8){ mAxisXValues.remove(0); } axisX.setValues(mAxisXValues); data.setAxisXBottom(axisX); line.setValues(mPointValues); List lines = new ArrayList(); lines.add(line); data.setLines(lines); chartView.setLineChartData(data); index++; final Viewport v = new Viewport(chartView.getMaximumViewport()); v.bottom = (float) 0.0; v.top = maxValue; chartView.setMaximumViewport(v); chartView.setCurrentViewport(v); } }); } private ArrayList dataList = new ArrayList<>(); private void getData(int size,boolean show) { HashMap params = new HashMap<>(); params.put("sensorKey", sensorKey); params.put("mac", mac); params.put("size", size + ""); mHttpUtils.doGet(API.SENSOR, params, CacheMode.DEFAULT, show, new HttpCallBack() { @Override public void onSuccess(String res, String msg) { if (progressDialog.isShowing()) { progressDialog.dismiss(); } ArrayList temp = (ArrayList) FastJsonTools.getArrayJson(res, SensorData.class); if (temp != null) { dataList.clear(); dataList.addAll(temp); } for (SensorData data:dataList){ reshowChart(data); } } @Override public void showLoadingDialog() { progressDialog.show(); } @Override public void onFail(int errno, String s) { if (progressDialog.isShowing()) { progressDialog.dismiss(); } } }); } @Override protected void onDestroy() { super.onDestroy(); if(timer!=null){ timer.cancel(); timer =null; } } }