package com.moral.yunfushao.activity; import android.graphics.Color; import android.os.Bundle; import android.support.annotation.IdRes; import android.view.View; import android.widget.ImageView; import android.widget.RadioGroup; import android.widget.TextView; import com.moral.andbrickslib.utils.TimeUtil; import com.moral.yunfushao.R; import com.moral.yunfushao.base.BaseActivity; import java.util.ArrayList; import java.util.List; import java.util.Random; 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 RadioGroup rg_time; private TextView tv_starttime,tv_endtime; private ImageView iv_pre,iv_next; private int type=0; @Override protected void getBundleExtras(Bundle extras) { } @Override protected int getLayoutId() { return R.layout.ac_charts_layout; } @Override protected void initViews() { initTopBar(); tv_title.setText("历史记录"); chartView = findView(R.id.chart); initLineChart(); rg_time = findView(R.id.rg_time); tv_starttime = findView(R.id.tv_starttime); tv_endtime = findView(R.id.tv_endtime); iv_pre = findView(R.id.iv_pre); iv_next = findView(R.id.iv_next); rg_time.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) { switch (i){ case R.id.rb_week: type = 0; axisX.setName("时间段(按周)"); //表格名称 data.setAxisXBottom(axisX); //x 轴在底部 chartView.setLineChartData(data); tv_endtime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",TimeUtil.getCurrentDate("yyyy-MM-dd"),-1)); tv_starttime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",tv_endtime.getText().toString(),-7)); break; case R.id.rb_month: type = 1; axisX.setName("时间段(按月)"); //表格名称 data.setAxisXBottom(axisX); //x 轴在底部 chartView.setLineChartData(data); tv_endtime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",TimeUtil.getCurrentDate("yyyy-MM-dd"),-1)); tv_starttime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",tv_endtime.getText().toString(),-28)); break; } } }); tv_endtime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",TimeUtil.getCurrentDate("yyyy-MM-dd"),-1)); tv_starttime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",tv_endtime.getText().toString(),-7)); } @Override protected void initListener() { iv_pre.setOnClickListener(this); iv_next.setOnClickListener(this); } @Override protected void initData() { reshowChart(); } @Override protected void processClick(View view) { switch (view.getId()){ case R.id.tv_left: finish(); break; case R.id.iv_pre: if(type==0){ tv_endtime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",tv_starttime.getText().toString(),-1)); tv_starttime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",tv_endtime.getText().toString(),-7)); }else if(type == 1){ tv_endtime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",tv_starttime.getText().toString(),-1)); tv_starttime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",tv_endtime.getText().toString(),-28)); } break; case R.id.iv_next: if(TimeUtil.getCurrentDate("yyyy-MM-dd").equals(TimeUtil.getAfterDate("yyyy-MM-dd",tv_endtime.getText().toString(),1))){ return; } if(type==0){ tv_starttime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",tv_endtime.getText().toString(),1)); tv_endtime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",tv_starttime.getText().toString(),7)); }else if(type == 1){ tv_starttime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",tv_endtime.getText().toString(),1)); tv_endtime.setText(TimeUtil.getAfterDate("yyyy-MM-dd",tv_starttime.getText().toString(),28)); } break; } } @Override protected void onErrorPageClick() { } private void initLineChart() { line = new Line(mPointValues).setColor(Color.parseColor("#9EF5DF")); //折线的颜色 List lines = new ArrayList<>(); line.setShape(ValueShape.CIRCLE);//折线图上每个数据点的形状 这里是圆形 (有三种 :ValueShape.SQUARE ValueShape.CIRCLE ValueShape.DIAMOND) line.setPointColor(Color.parseColor("#20DAE5")); 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); data.setValueLabelBackgroundColor(Color.TRANSPARENT);//此处设置坐标点旁边的文字背景 data.setValueLabelBackgroundEnabled(false); data.setValueLabelsTextColor(Color.GRAY); //坐标轴 axisX = new Axis(); //X轴 axisX.setHasTiltedLabels(false); //X坐标轴字体是斜的显示还是直的,true是斜的显示 axisX.setName("时间段(按周)"); //表格名称 axisX.setTextSize(10);//设置字体大小 axisX.setTextColor(getResources().getColor(R.color.red_txt)); // axisX.setMaxLabelChars(7); //最多几个X轴坐标,意思就是你的缩放让X轴上数据的个数7<=x<=mAxisXValues.length axisX.setValues(mAxisXValues); //填充X轴的坐标名称 axisX.setHasLines(true); //x 轴分割线 axisX.setLineColor(getResources().getColor(R.color.red_txt)); axisX.setHasSeparationLine(true); data.setAxisXBottom(axisX); //x 轴在底部 //data.setAxisXTop(axisX); //x 轴在顶部 // Y轴是根据数据的大小自动设置Y轴上限(在下面我会给出固定Y轴数据个数的解决方案) axisY = Axis.generateAxisFromRange(0,100,1); //Y轴 axisY.setAutoGenerated(false); axisY.setHasLines(true); axisY.setHasSeparationLine(true); axisY.setName("辐射");//y轴标注 axisY.setTextSize(10);//设置字体大小 axisY.setTextColor(getResources().getColor(R.color.red_txt)); axisY.setLineColor(getResources().getColor(R.color.red_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); */ // chartView.setCurrentViewport(initViewPort(0,7)); chartView.startDataAnimation(); } private Viewport initViewPort(float left, float right) { Viewport port = new Viewport(); port.left = left; port.right = right; return port; } Random random = new Random(); private void reshowChart() { chartView.post(new Runnable() { @Override public void run() { for (int i=0;i<10;i++){ mPointValues.add(new PointValue(i,random.nextInt(100)%(100-0+1) + 0)); mAxisXValues.add(new AxisValue(i).setLabel(i + "")); } axisX.setValues(mAxisXValues); data.setAxisXBottom(axisX); line.setValues(mPointValues); List lines = new ArrayList(); lines.add(line); data.setLines(lines); chartView.setLineChartData(data); final Viewport v = new Viewport(chartView.getMaximumViewport()); v.bottom = -5; v.top = 100 + 5; // You have to set max and current viewports separately. chartView.setMaximumViewport(v); // I changing current viewport with animation in this case. // lineChartCO2.setCurrentViewportWithAnimation(v); chartView.setCurrentViewport(v); } }); } }