package com.moral.yunfushao.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.yunfushao.MainApp; import com.moral.yunfushao.R; import com.moral.yunfushao.base.BaseActivity; import com.moral.yunfushao.common.API; import com.moral.yunfushao.httputils.HttpCallBack; import com.moral.yunfushao.httputils.HttpUtils; import com.moral.yunfushao.imageload.ImageLoader; import com.moral.yunfushao.model.UserData; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; 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 RadioGroup rg_time; private TextView tv_starttime, tv_endtime, tv_value, tv_status; private ImageView iv_pre, iv_next; private int type = 2; @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); tv_value = findView(R.id.tv_value); tv_status = findView(R.id.tv_status); 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(), -6)); getData(tv_starttime.getText().toString(), tv_endtime.getText().toString()); 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)); getData(tv_starttime.getText().toString(), tv_endtime.getText().toString()); break; case R.id.rb_day: type = 2; axisX.setName("时间段(按日)"); //表格名称 data.setAxisXBottom(axisX); //x 轴在底部 chartView.setLineChartData(data); tv_endtime.setText(TimeUtil.getAfterDate("yyyy-MM-dd", TimeUtil.getCurrentDate("yyyy-MM-dd"), 0)); tv_starttime.setText(tv_endtime.getText().toString()); getData(tv_starttime.getText().toString(), tv_endtime.getText().toString()); break; } } }); tv_endtime.setText(TimeUtil.getAfterDate("yyyy-MM-dd", TimeUtil.getCurrentDate("yyyy-MM-dd"), 0)); tv_starttime.setText(tv_endtime.getText().toString()); getData(tv_starttime.getText().toString(), tv_endtime.getText().toString()); } @Override protected void initListener() { iv_pre.setOnClickListener(this); iv_next.setOnClickListener(this); } @Override protected void initData() { reshowChart(dataList); getAd(); } @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(), -6)); } 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)); } else if (type == 2) { tv_endtime.setText(TimeUtil.getAfterDate("yyyy-MM-dd", tv_starttime.getText().toString(), -1)); tv_starttime.setText(tv_endtime.getText().toString()); } getData(tv_starttime.getText().toString(), tv_endtime.getText().toString()); break; case R.id.iv_next: if (type == 0) { if (TimeUtil.getCurrentDate("yyyy-MM-dd").equals(TimeUtil.getAfterDate("yyyy-MM-dd", tv_endtime.getText().toString(), 1))) { return; } 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(), 6)); } else if (type == 1) { if (TimeUtil.getCurrentDate("yyyy-MM-dd").equals(TimeUtil.getAfterDate("yyyy-MM-dd", tv_endtime.getText().toString(), 1))) { return; } 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)); } else if (type == 2) { if (TimeUtil.getCurrentDate("yyyy-MM-dd").equals(TimeUtil.getAfterDate("yyyy-MM-dd", tv_endtime.getText().toString(), 0))) { return; } tv_starttime.setText(TimeUtil.getAfterDate("yyyy-MM-dd", tv_endtime.getText().toString(), 1)); tv_endtime.setText(tv_starttime.getText().toString()); } getData(tv_starttime.getText().toString(), tv_endtime.getText().toString()); 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(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(3); line.setFormatter(chartValueFormatter);//显示小数点 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(true); //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, (float) 4.0, (float) 0.25); //Y轴 axisY.setAutoGenerated(false); AxisValueFormatter yvalue = new SimpleAxisValueFormatter(1); axisY.setFormatter(yvalue); axisY.setHasLines(true); axisY.setHasSeparationLine(true); axisY.setName("辐射");//y轴标注 axisY.setTextSize(10);//设置字体大小 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); */ // chartView.setCurrentViewport(initViewPort(0,7)); final Viewport v = new Viewport(chartView.getMaximumViewport()); v.bottom = (float) 0.0; v.top = (float) 4.0; // // 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); // chartView.startDataAnimation(); } private Viewport initViewPort(float left, float right) { Viewport port = new Viewport(); port.left = left; port.right = right; return port; } private void reshowChart(final ArrayList dataList) { chartView.post(new Runnable() { @Override public void run() { mPointValues.clear(); mAxisXValues.clear(); for (int i = 0; i < dataList.size(); i++) { if (type == 2) { mPointValues.add(new PointValue(i, dataList.get(i).getHour_avg())); mAxisXValues.add(new AxisValue(i).setLabel((dataList.get(i).getTime_level() - 1) * 3 + "时")); } else { mPointValues.add(new PointValue(i, dataList.get(i).getDay_avg())); mAxisXValues.add(new AxisValue(i).setLabel(dataList.get(i).getDate().substring(5, 10))); } // 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 = (float) 0.0; v.top = (float) 4.0; //// // 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); } }); } private ArrayList dataList = new ArrayList<>(); private void getData(String startTime, String endTime) { HashMap params = new HashMap<>(); params.put("user_id", MainApp.userId); params.put("start_time", startTime); params.put("end_time", endTime); HttpUtils.doPost(API.GETUSERDATALIST, params, CacheMode.DEFAULT, true, new HttpCallBack() { @Override public void onSuccess(String res, String msg) { if (progressDialog.isShowing()) { progressDialog.dismiss(); } try { JSONObject jsonObject = new JSONObject(res); String data = jsonObject.optString("data"); ArrayList temp = (ArrayList) FastJsonTools.getArrayJson(data, UserData.class); dataList.clear(); dataList.addAll(resetData(temp)); //重绘 reshowChart(dataList); tv_value.setText(NumberUtils.getBigDecimalValue(jsonObject.optDouble("avg"), 3) + "uSv"); tv_status.setText(jsonObject.optString("status")); } catch (JSONException e) { e.printStackTrace(); } } @Override public void showLoadingDialog() { progressDialog.show(); } @Override public void onFail(int errno, String s) { if (progressDialog.isShowing()) { progressDialog.dismiss(); } dataList.clear(); dataList.addAll(resetData(new ArrayList())); //重绘 reshowChart(dataList); } }); } private ArrayList resetData(ArrayList tempList) { ArrayList newList = new ArrayList<>(); if (type == 0) {//周 for (int i = 0; i < 7; i++) { UserData data = new UserData(); data.setDate(TimeUtil.getAfterDate("yyyy-MM-dd", tv_starttime.getText().toString(), i)); data.setDay_avg(0); newList.add(data); } } else if (type == 1) {//月 for (int i = 0; i < 7; i++) { UserData data = new UserData(); data.setDate(TimeUtil.getAfterDate("yyyy-MM-dd", tv_starttime.getText().toString(), i * 4)); data.setDay_avg(0); newList.add(data); } } else if (type == 2) {//日 for (int i = 0; i < 8; i++) { UserData data = new UserData(); data.setTime_level(i + 1); data.setHour_avg(0); newList.add(data); } } //重构数据 float totalValues = 0; if (tempList != null && tempList.size() > 0) { for (UserData data : tempList) { totalValues += data.getDay_avg(); for (UserData data1 : newList) { if (type == 2) { if (data.getTime_level() == data1.getTime_level()) { data1.setHour_avg(data.getHour_avg()); } } else { if (data.getDate().equals(data1.getDate())) { data1.setDay_avg(data.getDay_avg()); } } } } // tv_value.setText(totalValues/tempList.size()+"uSv"); } else { // tv_value.setText(0+"uSv"); } return newList; } private AlertDialog adDialog; private View adView; private TextView tv_content, tv_name; private ImageView iv_logo; private Button bt_cancel, bt_ok; private void showAd(String content, String logo, String name) { adView = LayoutInflater.from(this).inflate(R.layout.dialog_ad_layout, null); tv_content = (TextView) adView.findViewById(R.id.tv_content); tv_name = (TextView) adView.findViewById(R.id.tv_name); bt_cancel = (Button) adView.findViewById(R.id.bt_cancel); bt_ok = (Button) adView.findViewById(R.id.bt_ok); iv_logo = (ImageView) adView.findViewById(R.id.iv_logo); tv_content.setText(content); tv_name.setText(name); ImageLoader.setCircleImageView(this, logo, iv_logo, R.mipmap.circle); bt_cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { adDialog.dismiss(); } }); adDialog = new AlertDialog.Builder(this).setView(adView).create(); Window window = adDialog.getWindow(); window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); adDialog.show(); } private void getAd() { HttpUtils.doPost(API.GETAD, null, CacheMode.DEFAULT, false, new HttpCallBack() { @Override public void onSuccess(String res, String msg) { if (TextUtils.isEmpty(res)) { return; } try { JSONObject json = new JSONObject(res); showAd(json.optString("content"), json.optString("logo"), json.optString("name")); } catch (JSONException e) { e.printStackTrace(); } } @Override public void showLoadingDialog() { } @Override public void onFail(int errno, String s) { } }); } }