怎么用Android的HelloChart绘制多折线图
发表于:2024-10-30 作者:千家信息网编辑
千家信息网最后更新 2024年10月30日,本文小编为大家详细介绍"怎么用Android的HelloChart绘制多折线图",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么用Android的HelloChart绘制多折线图"文章能帮助大家解决
千家信息网最后更新 2024年10月30日怎么用Android的HelloChart绘制多折线图
本文小编为大家详细介绍"怎么用Android的HelloChart绘制多折线图",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么用Android的HelloChart绘制多折线图"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
一、效果图
二、实现步骤
1.添加依赖库
compile 'com.github.lecho:hellocharts-android:v1.5.8'
2.布局文件
3.Activity类
package com.aldx.hccraftsman.activity;import android.content.Context;import android.content.Intent;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Typeface;import android.os.Bundle;import android.view.View;import android.view.Window;import android.view.WindowManager;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import com.aldx.hccraftsman.R;import com.aldx.hccraftsman.application.Application;import com.aldx.hccraftsman.base.BaseActivity;import com.aldx.hccraftsman.entity.DustLineChart;import com.aldx.hccraftsman.entity.DustLineChartModel;import com.aldx.hccraftsman.entity.TempChartData;import com.aldx.hccraftsman.jsonparse.JSONObject;import com.aldx.hccraftsman.jsonparse.ReflectUtil;import com.aldx.hccraftsman.okHttp.LoadingDialogCallback;import com.aldx.hccraftsman.utils.Api;import com.aldx.hccraftsman.utils.Constants;import com.aldx.hccraftsman.utils.LogUtil;import com.aldx.hccraftsman.utils.Utils;import com.lzy.okgo.OkGo;import java.text.ParseException;import java.util.ArrayList;import java.util.Calendar;import java.util.Date;import java.util.List;import butterknife.BindView;import butterknife.ButterKnife;import butterknife.OnClick;import cn.qqtheme.framework.picker.DatePicker;import cn.qqtheme.framework.picker.DateTimePicker;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;import okhttp3.Call;import okhttp3.Response;/** * author: chenzheng * created on: 2017/9/29 10:18 * description: */public class DustLineChartActivity extends BaseActivity { @BindView(R.id.line_chart) LineChartView lineChart; @BindView(R.id.back_iv) ImageView backIv; @BindView(R.id.layout_back) LinearLayout layoutBack; @BindView(R.id.title_tv) TextView titleTv; @BindView(R.id.right_tv) TextView rightTv; @BindView(R.id.layout_right) LinearLayout layoutRight; private String projectId; private Listcolors = new ArrayList<>(); private List listTemp = new ArrayList ();//数据 private List mAxisXValues = new ArrayList (); //x轴方向的坐标数据 private List mAxisYValues = new ArrayList (); //y轴方向的坐标数据 private List distanceList = new ArrayList (); private boolean hasAxes = true; //是否有轴,x和y轴 private boolean hasAxesNames = true; //是否有轴的名字 private boolean hasLines = true; //是否有线(点和点连接的线,选择false只会出现点) private boolean hasPoints = true; //是否有点(每个值的点) private ValueShape shape = ValueShape.CIRCLE; //点显示的形式,圆形,正方向,菱形 private boolean isFilled = false; //是否是填充 private boolean hasLabels = true; //每个点是否有名字 private boolean isCubic = false; //是否是立方的,线条是直线还是弧线 private boolean hasLabelForSelected = false; //每个点是否可以选择(点击效果) private LineChartData data; // 折线图封装的数据类 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_dust_line_chart); projectId = getIntent().getStringExtra("projectId"); ButterKnife.bind(this); initView(); initData(); doRequest(); } private void initData() { //颜色集合 colors.add(0xff0862D8); colors.add(0xff6221D1); colors.add(0xff552705); colors.add(0xff088B05); colors.add(0xffBF0815); } private void initView() { titleTv.setText("扬尘监测折线图"); Calendar calendar1 = Calendar.getInstance(); String sss = Utils.DATE_SIMPLE_FORMATER.format(calendar1.getTime()); rightTv.setText(sss); layoutRight.setVisibility(View.VISIBLE); } public void doRequest() { OkGo.get(Api.GET_MONITOR_MONTH_BY_PROJECT_ID) .tag(this) .params("projectId", projectId) .params("time", rightTv.getText().toString()) .execute(new LoadingDialogCallback(this, Constants.LOADING_TXT) { @Override public void onSuccess(String s, Call call, Response response) { DustLineChartModel dustLineChartModel = null; try { dustLineChartModel = (DustLineChartModel) ReflectUtil .copy(DustLineChartModel.class, new JSONObject(s)); } catch (Exception e) { e.printStackTrace(); } if (dustLineChartModel != null) { if (dustLineChartModel.code == Api.SUCCESS_CODE) { if (dustLineChartModel.data != null) { setLineChartData(dustLineChartModel.data); } } else { Application.showCodeToast(DustLineChartActivity.this, dustLineChartModel.code); } } } @Override public void onError(Call call, Response response, Exception e) { super.onError(call, response, e); Application.showResultToast(DustLineChartActivity.this, call, e); } }); } private void setLineChartData(List dlcList) { listTemp.clear(); mAxisXValues.clear(); mAxisYValues.clear(); distanceList.clear(); float yMax = 0; try { int xCount = 0; Calendar curCalendar = Calendar.getInstance(); String curDateStr = Utils.DATE_SIMPLE_FORMATER.format(curCalendar.getTime()); if (rightTv.getText().toString().equals(curDateStr)) { xCount = curCalendar.get(Calendar.DAY_OF_MONTH); } else { Date queryDate = Utils.DATE_FORMATER.parse(rightTv.getText().toString() + "-01"); Calendar queryCalendar = Calendar.getInstance(); queryCalendar.setTime(queryDate); xCount = queryCalendar.getActualMaximum(Calendar.DAY_OF_MONTH); } LogUtil.e("xCount=" + xCount); for (int j = 1; j <= xCount; j++) { boolean isFinded = false; for (DustLineChart dlc : dlcList) { String tempStr = dlc.time; if (!Utils.isEmpty(tempStr)) { Date tempDate = Utils.DATE_FORMATER.parse(tempStr); Calendar tempCalendar = Calendar.getInstance(); tempCalendar.setTime(tempDate); if (j == (tempCalendar.get(Calendar.DAY_OF_MONTH))) { isFinded = true; if (Utils.toFloat(dlc.pm2) > yMax) { yMax = Utils.toFloat(dlc.pm2); } if (Utils.toFloat(dlc.pm10) > yMax) { yMax = Utils.toFloat(dlc.pm10); } if (Utils.toFloat(dlc.windspeed) > yMax) { yMax = Utils.toFloat(dlc.windspeed); } if (Utils.toFloat(dlc.temperature) > yMax) { yMax = Utils.toFloat(dlc.temperature); } if (Utils.toFloat(dlc.noise) > yMax) { yMax = Utils.toFloat(dlc.noise); } listTemp.add(new TempChartData(j + "", Utils.toFloat(dlc.pm2), Utils.toFloat(dlc.pm10), Utils.toFloat(dlc.windspeed), Utils.toFloat(dlc.temperature), Utils.toFloat(dlc.noise))); break; } } } if (!isFinded) { listTemp.add(new TempChartData(j + "", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); } } //设置x轴坐标 ,显示的是时间5-1,5-2.。。。 mAxisXValues.clear(); for (int i = 1; i <= xCount; i++) { //mClockNumberLength mAxisXValues.add(new AxisValue(i).setLabel(i + "")); } mAxisYValues.clear(); float temp = (yMax + 10) / 10; for (int k = 0; k < 10; k++) { float ttt = temp * k; float fff = Utils.toFloat(((int)ttt)+""); mAxisYValues.add(new AxisValue(fff).setLabel("" + (int)fff)); } //获取距离 for (int i = 1; i <= listTemp.size(); i++) { float apart = i;//得到的拒Y轴的距离 distanceList.add(apart); } //存放线条对象的集合 List lines = new ArrayList (); lines.clear(); //把数据设置到线条上面去 for (int i = 0; i < 5; ++i) { List values = new ArrayList (); for (int j = 0; j < listTemp.size(); ++j) { //i=0是最高温度的线,i=1,是最低温度的线 //PointValue的两个参数值,一个是距离y轴的长度距离,另一个是距离x轴长度距离 if (i == 0) { values.add(new PointValue(distanceList.get(j), listTemp.get(j).pm2).setLabel("" + listTemp.get(j).pm2)); } else if (i == 1) { values.add(new PointValue(distanceList.get(j), listTemp.get(j).pm10).setLabel("" + listTemp.get(j).pm10)); } else if (i == 2) { values.add(new PointValue(distanceList.get(j), listTemp.get(j).windspeed).setLabel("" + listTemp.get(j).windspeed)); } else if (i == 3) { values.add(new PointValue(distanceList.get(j), listTemp.get(j).temperature).setLabel("" + listTemp.get(j).temperature)); } else if (i == 4) { values.add(new PointValue(distanceList.get(j), listTemp.get(j).noise).setLabel("" + listTemp.get(j).noise)); } } Line line = new Line(values); //设置线条的基本属性 line.setColor(colors.get(i)); line.setShape(shape); line.setCubic(isCubic); line.setFilled(isFilled); line.setHasLabels(hasLabels); line.setHasLabelsOnlyForSelected(hasLabelForSelected); line.setHasLines(hasLines); line.setHasPoints(hasPoints); line.setStrokeWidth(1); line.setPointRadius(3); lines.add(line); } data = new LineChartData(lines); if (hasAxes) { Axis axisX = new Axis(); Axis axisY = new Axis().setHasLines(true); if (hasAxesNames) { axisX.setName("日期"); axisY.setName("数值"); } //对x轴,数据和属性的设置 axisX.setTextSize(8);//设置字体的大小 axisX.setHasTiltedLabels(false);//x坐标轴字体是斜的显示还是直的,true表示斜的 axisX.setTextColor(Color.BLACK);//设置字体颜色 axisX.setHasLines(true);//x轴的分割线 axisX.setValues(mAxisXValues); //设置x轴各个坐标点名称 //对Y轴 ,数据和属性的设置 axisY.setTextSize(10); axisY.setHasTiltedLabels(false);//true表示斜的 axisY.setTextColor(Color.BLACK);//设置字体颜色 axisY.setValues(mAxisYValues); //设置x轴各个坐标点名称 data.setAxisXBottom(axisX);//x轴坐标线的文字,显示在x轴下方// data.setAxisXTop(); //显示在x轴上方 data.setAxisYLeft(axisY); //显示在y轴的左边 } else { data.setAxisXBottom(null); data.setAxisYLeft(null); } data.setBaseValue(2f); //设置反向覆盖区域颜色 ?? data.setValueLabelBackgroundAuto(false);//设置数据背景是否跟随节点颜色 data.setValueLabelBackgroundColor(Color.BLUE);//设置数据背景颜色 data.setValueLabelBackgroundEnabled(false);//设置是否有数据背景 data.setValueLabelsTextColor(Color.RED);//设置数据文字颜色 data.setValueLabelTextSize(11);//设置数据文字大小 data.setValueLabelTypeface(Typeface.MONOSPACE);//设置数据文字样式 lineChart.setLineChartData(data); //将数据添加到控件中 lineChart.setViewportCalculationEnabled(false); lineChart.setZoomType(ZoomType.HORIZONTAL_AND_VERTICAL);//设置线条可以水平方向收缩 final Viewport v = new Viewport(lineChart.getMaximumViewport()); v.bottom = 0; v.top = yMax+10; v.left = 0; v.right = listTemp.size(); // listBlood.size() - 1//如何解释 lineChart.setMaximumViewport(v); lineChart.setCurrentViewport(v); } catch (Exception e) { e.printStackTrace(); } } public static void startActivity(Context context, String projectId) { Intent intent = new Intent(context, DustLineChartActivity.class); intent.putExtra("projectId", projectId); context.startActivity(intent); } @OnClick({R.id.layout_back, R.id.layout_right}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.layout_back: finish(); break; case R.id.layout_right: chooseDate(); break; } } private void chooseDate() { Calendar cal = Calendar.getInstance(); try { cal.setTime(Utils.DATE_FORMATER.parse(rightTv.getText().toString()+"-01")); } catch (ParseException e) { e.printStackTrace(); } Calendar curCal = Calendar.getInstance(); int curMonth = cal.get(Calendar.MONTH) + 1; int curYear = cal.get(Calendar.YEAR); final DatePicker picker = new DatePicker(this, DateTimePicker.YEAR_MONTH); picker.setRangeEnd(curCal.get(Calendar.YEAR), curCal.get(Calendar.MONTH) + 1); picker.setRangeStart(2010, 1); picker.setUseWeight(true); picker.setSelectedItem(curYear, curMonth); picker.setOnDatePickListener(new DatePicker.OnYearMonthPickListener() { @Override public void onDatePicked(String year, String month) { rightTv.setText(year + "-" + month); doRequest(); } }); picker.show(); }}
读到这里,这篇"怎么用Android的HelloChart绘制多折线图"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
数据
颜色
线图
线条
坐标
字体
文字
方向
属性
文章
背景
内容
名字
名称
大小
效果
标点
步骤
温度
还是
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器如何支持https
数据库实体的作用
16核32g20m云服务器
海南互联网网络技术服务哪家好
软件开发品牌企业
数据库2014ssms
计算机网络技术的机遇
安卓 服务器
关于以网络安全的故事
软件开发设计知识产权
redis数据库save
域名服务器网址是什么关系
思高网络技术
计算机国际网络安全管理办法
app软件开发商务计划书
网络安全法规21条
对比3个月数据库
在线矿物数据库
云南省公安厅网络安全处处长
服务器主机管理软件
软件开发初期的测试
服务器如何支持https
下列属于重大网络安全事件
怎么轰炸传奇服务器
软件开发延期补充协议范本
思高网络技术
数据库远程地址在哪看
数据库错误1820
银行的业务系统 软件开发
网络安全手抄抄报内容