我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android实现动态添加数据与堆叠折线图的方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android实现动态添加数据与堆叠折线图的方法是什么

本篇内容介绍了“Android实现动态添加数据与堆叠折线图的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

效果视频

Android实现动态添加数据与堆叠折线图的方法是什么

引用

描述

本示例采用的是非常、非常、非常好用的一款第三方SDK——helloCharts
传送门

导包

第一步 :导入maven

maven { url 'https://jitpack.io' }

Android实现动态添加数据与堆叠折线图的方法是什么

导入依赖

implementation 'com.github.lecho:hellocharts-library:1.5.8@aar'

代码分析

本示例总共采用了三条折线,分别为温度、湿度、光照

初始化

初始化三条折线颜色

TmpLine = new Line( mTmpChart ).setColor( Color.parseColor( "#cc00ff" ) ); HumLine= new Line( mHumChart ).setColor( Color.parseColor( "#0033ff" ) ); LightLine = new Line( mLightChart ).setColor( Color.parseColor( "#cc0000" ) );

初始化三条折线样式

TmpLine.setShape( ValueShape.SQUARE);        TmpLine.setCubic(true);//曲线是否平滑,即是曲线还是折线        TmpLine.setFilled(true);//是否填充曲线的面积        TmpLine.setHasLabels(true);//曲线的数据坐标是否加上备注        TmpLine.setHasLines(true);//是否用线显示。如果为false 则没有曲线只有点显示        TmpLine.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示(每个数据点都是个大的圆点)        HumLine.setShape( ValueShape.CIRCLE);//折线图上每个数据点的形状  这里是圆形 (有三种 :ValueShape.SQUARE  ValueShape.CIRCLE  ValueShape.DIAMOND)        HumLine.setCubic(true);//曲线是否平滑,即是曲线还是折线        HumLine.setFilled(true);//是否填充曲线的面积        HumLine.setHasLabels(true);//曲线的数据坐标是否加上备注        HumLine.setHasLines(true);//是否用线显示。如果为false 则没有曲线只有点显示        HumLine.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示(每个数据点都是个大的圆点)        LightLine.setShape( ValueShape.DIAMOND);//折线图上每个数据点的形状  这里是圆形 (有三种 :ValueShape.SQUARE  ValueShape.CIRCLE  ValueShape.DIAMOND)        LightLine.setCubic(true);//曲线是否平滑,即是曲线还是折线        LightLine.setFilled(true);//是否填充曲线的面积        LightLine.setHasLabels(true);//曲线的数据坐标是否加上备注        LightLine.setHasLines(true);//是否用线显示。如果为false 则没有曲线只有点显示        LightLine.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示(每个数据点都是个大的圆点)

将三条折线添加到折线集合内

lines.add( TmpLine );        lines.add( HumLine );        lines.add( LightLine );

添加折线

data = new LineChartData();        data.setLines(lines);

初始化X轴、Y轴样式属性

Axis axisX = new Axis(); //X轴        axisX.setHasTiltedLabels(false);  //X坐标轴字体是斜的显示还是直的,true是斜的显示        axisX.setTextColor(Color.RED);  //设置字体颜色        //axisX.setName("时间");  //表格名称        axisX.setTextSize(7);//设置字体大小        axisX.setMaxLabelChars(10); //最多几个X轴坐标,意思就是你的缩放让X轴上数据的个数7<=x<=mAxisXValues.length        axisX.setValues(mAxisXValues);  //填充X轴的坐标名称        data.setAxisXBottom(axisX); //x 轴在底部        //data.setAxisXTop(axisX);  //x 轴在顶部        axisX.setHasLines(true); //x 轴分割线        // Y轴是根据数据的大小自动设置Y轴上限(在下面我会给出固定Y轴数据个数的解决方案)        Axis axisY = new Axis();  //Y轴        axisY.setName("历史数据");//y轴标注        axisY.setTextSize(10);//设置字体大小        axisY.setTextColor( Color.RED );        axisX.setLineColor( Color.GREEN );        data.setAxisYLeft(axisY);  //Y轴设置在左边

设置折线图支持滑动、缩放、平移等功能

lineChart.setInteractive(true);        lineChart.setZoomType( ZoomType.HORIZONTAL);        lineChart.setMaxZoom((float) 2);//最大方法比例        lineChart.setContainerScrollEnabled(true, ContainerScrollType.HORIZONTAL);        lineChart.setLineChartData(data);        lineChart.setVisibility( View.VISIBLE);        Viewport v = new Viewport(lineChart.getMaximumViewport());        v.left = 0;        v.right = 7;        lineChart.setCurrentViewport(v);

动态添加数据

采用Timer动态添加数据

  private void getValue(){      timer = new Timer(  );      timer.schedule( new TimerTask() {          @Override          public void run() {           runOnUiThread( ()->{               getTmp();               getHum();               getLight();           } );          }      } ,100,2000);  }
温度数据

从云获取数据

 float tmp = Float.parseFloat( pointDTO.get( i ).Value );

刷新数据,(很重要)

 lineChart.setLineChartData(data);
private void getTmp(){      business.getSensorData( Param.DEVICEID, Param.TMPTAG, "1", "1", null, null, "ASC", "20", "1", new NCallBack<BaseResponseEntity<SensorDataPageDTO>>(context) {          @Override          protected void onResponse(BaseResponseEntity<SensorDataPageDTO> response) {          }          @Override          public void onResponse(Call<BaseResponseEntity<SensorDataPageDTO>> call, Response<BaseResponseEntity<SensorDataPageDTO>> response) {              super.onResponse( call, response );              BaseResponseEntity<SensorDataPageDTO> dto = response.body();              if (dto != null && dto.getStatus() == 0){                  List<SensorDataPageDTO.VR> pointDTO = dto.getResultObj().DataPoints.get( 0 ).PointDTO;                  if (pointDTO != null){                      for (int i = 0; i <pointDTO.size() ; i++) {                          float tmp = Float.parseFloat( pointDTO.get( i ).Value );                          //Toast.makeText( context,tmp+"",Toast.LENGTH_SHORT ).show();                          mTmpChart.add( new PointValue( i,tmp ) );                          lineChart.setLineChartData(data);                      }                  }else {                   Toast.makeText( context,"数据为空",Toast.LENGTH_SHORT ).show();                  }              }          }      } );  }
湿度数据
business.getSensorData( Param.DEVICEID, Param.HUMTAG, "1", "1", null, null, "ASC", "20", "1", new NCallBack<BaseResponseEntity<SensorDataPageDTO>>(context) {          @Override          protected void onResponse(BaseResponseEntity<SensorDataPageDTO> response) {          }          @Override          public void onResponse(Call<BaseResponseEntity<SensorDataPageDTO>> call, Response<BaseResponseEntity<SensorDataPageDTO>> response) {              super.onResponse( call, response );              BaseResponseEntity<SensorDataPageDTO> dto = response.body();              if (dto != null && dto.getStatus() == 0){                  List<SensorDataPageDTO.VR> pointDTO = dto.getResultObj().DataPoints.get( 0 ).PointDTO;                  if (pointDTO != null){                      for (int i = 0; i <pointDTO.size() ; i++) {                          float hum = Float.parseFloat( pointDTO.get( i ).Value );                          //Toast.makeText( context,tmp+"",Toast.LENGTH_SHORT ).show();                          mHumChart.add( new PointValue( i,hum ) );                          lineChart.setLineChartData(data);                      }                  }else {                      Toast.makeText( context,"数据为空",Toast.LENGTH_SHORT ).show();                  }              }          }      } );  }
光照数据
 private void getLight(){      business.getSensorData( Param.DEVICEID, Param.LIGHTTAG, "1", "1", null, null, "ASC", "20", "1", new NCallBack<BaseResponseEntity<SensorDataPageDTO>>(context) {          @Override          protected void onResponse(BaseResponseEntity<SensorDataPageDTO> response) {          }          @Override          public void onResponse(Call<BaseResponseEntity<SensorDataPageDTO>> call, Response<BaseResponseEntity<SensorDataPageDTO>> response) {              super.onResponse( call, response );              BaseResponseEntity<SensorDataPageDTO> dto = response.body();              if (dto != null && dto.getStatus() == 0){                  List<SensorDataPageDTO.VR> pointDTO = dto.getResultObj().DataPoints.get( 0 ).PointDTO;                  if (pointDTO != null){                      for (int i = 0; i <pointDTO.size() ; i++) {                          float light = Float.parseFloat( pointDTO.get( i ).Value );                          //Toast.makeText( context,tmp+"",Toast.LENGTH_SHORT ).show();                          mLightChart.add( new PointValue( i,light ) );                          lineChart.setLineChartData(data);                      }                  }else {                      Toast.makeText( context,"数据为空",Toast.LENGTH_SHORT ).show();                  }              }          }      } );  }

动态添加X轴时间值

初始化

X轴自动刷新时间依旧采用Timer实现
这俩属性较为重要

axisX.setTextSize(7);//设置字体大小        axisX.setMaxLabelChars(10); //最多几个X轴坐标,意思就是你的缩放让X轴上数据的

X轴属性初始化

Axis axisX = new Axis(); //X轴        axisX.setHasTiltedLabels(false);  //X坐标轴字体是斜的显示还是直的,true是斜的显示        axisX.setTextColor(Color.RED);  //设置字体颜色        //axisX.setName("时间");  //表格名称        axisX.setTextSize(7);//设置字体大小        axisX.setMaxLabelChars(10); //最多几个X轴坐标,意思就是你的缩放让X轴上数据的个数7<=x<=mAxisXValues.length        axisX.setValues(mAxisXValues);  //填充X轴的坐标名称        data.setAxisXBottom(axisX); //x 轴在底部        //data.setAxisXTop(axisX);  //x 轴在顶部        axisX.setHasLines(true); //x 轴分割线
自动刷新时间实现
private void getAxis() {        timerY = new Timer(  );        timerY.schedule( new TimerTask() {            @Override            public void run() {                test();            }        },100,2000 );    }
private void test(){                business.getSensorData( Param.DEVICEID, Param.TMPTAG, "1", "1", null,null, "ASC", "20", "1", new NCallBack<BaseResponseEntity<SensorDataPageDTO>>(context) {            @Override            protected void onResponse(BaseResponseEntity<SensorDataPageDTO> response) {            }            @Override            public void onResponse(Call<BaseResponseEntity<SensorDataPageDTO>> call, Response<BaseResponseEntity<SensorDataPageDTO>> response) {                super.onResponse( call, response );                BaseResponseEntity<SensorDataPageDTO> dto = response.body();                if (dto != null && dto.getStatus() == 0){                    List<SensorDataPageDTO.VR> pointDTO = dto.getResultObj().DataPoints.get( 0 ).PointDTO;                    SensorDataPageDTO.VR[] array = new SensorDataPageDTO.VR[pointDTO.size()];                    pointDTO.toArray(array);                    mAxisXValues.clear();                    mTime = new String[array.length];                        for (int i = 0; i < array.length ; i++) {                            //mAxisXValues.clear();                            mTime[i] = pointDTO.get( i ).RecordTime;                            mAxisXValues.add(new AxisValue(i).setLabel(mTime[i]));                        }                    runOnUiThread( ()->{                        lineChart.setLineChartData(data);                    } );                }            }        } );    }

“Android实现动态添加数据与堆叠折线图的方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android实现动态添加数据与堆叠折线图的方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android实现动态添加数据与堆叠折线图的方法是什么

本篇内容介绍了“Android实现动态添加数据与堆叠折线图的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果视频引用描述本示例采
2023-06-25

android listview动态添加数据的方法是什么

在Android中,可以通过以下方法动态添加数据到ListView中:1. 创建一个数据源:首先,需要创建一个数据源,用于存储要显示在ListView中的数据。可以使用ArrayList或ArrayAdapter等数据结构来保存数据。2.
2023-09-16

C/C++ Qt数据库与TableView实现多组件联动的方法是什么

这篇文章主要讲解了“C/C++ Qt数据库与TableView实现多组件联动的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C/C++ Qt数据库与TableView实现多组件联动
2023-06-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录