怎么用Android的HelloChart绘制多折线图
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本文小编为大家详细介绍"怎么用Android的HelloChart绘制多折线图",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么用Android的HelloChart绘制多折线图"文章能帮助大家解决
千家信息网最后更新 2025年11月08日怎么用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 List colors = 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安全错误
数据库的锁怎样保障安全
酒店数据库表
重庆秀山县软件开发机构
网络安全题库及答案
内蒙微包网络技术
解决网络安全问题的技术方法
计算机服务器SE
wz服务器
好用的数据库备注技巧
前台无法连接数据库地址
中国网络技术属于中国吗
网络安全在身边争做好校园好网民
青铜峡app软件开发
cf服务器人数已满请稍候尝试
普通显卡能在服务器上用吗
怎么关闭数据库运行吗
软件开发学单词
微信小程序是不是软件开发
网络安全法立法的目的
原神怎么从小米服务器转到官服
计算机网络技术技能基础
时序数据库 point
软件开发用多大的显示屏
百万亚瑟王服务器
天津招聘软件开发
网络安全攻防测试
网络安全课护苗
打印机服务器需要什么配置
均益网络技术有限公司
盲目依赖网络技术
中国移动互联网有哪些黑科技