package com.wissea.trs.activity;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OptionalDataException;
import java.io.StreamCorruptedException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.RadioButton;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.Legend.LegendForm;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.XAxis.XAxisPosition;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.wissea.trs.Constant;
import com.wissea.trs.R;
import com.wissea.trs.ResponseStatus;
import com.wissea.trs.api.WeatherService;
import com.wissea.trs.utils.DateTools;
public class HistoryActivity extends BaseActivity implements OnCheckedChangeListener{
private WeatherService mWeatherService;
private String sensorCode;
private String endDate;
private String weekReportStartDate;
private String monthReportStartDate;
private String seasonReportStartDate;
private LineData mTemperatureDataWeek;
private LineData mHumidityDataWeek;
private LineData mAmmoniaDataWeek;
private List<String> mWeekXValues;
private List<Entry> mWeekYValuesTemperature;
private List<Entry> mWeekYValuesHumidity;
private List<Entry> mWeekYValuesAmmonia;
private LineData mTemperatureDataMonth;
private LineData mHumidityDataMonth;
private LineData mAmmoniaDataMonth;
private List<String> mMonthXValues;
private List<Entry> mMonthYValuesTemperature;
private List<Entry> mMonthYValuesHumidity;
private List<Entry> mMonthYValuesAmmonia;
private LineData mTemperatureDataSeason;
private LineData mHumidityDataSeason;
private LineData mAmmoniaDataSeason;
private List<String> mSeasonXValues;
private ArrayList<Entry> mSeasonYValuesTemperature;
private ArrayList<Entry> mSeasonYValuesHumidity;
private ArrayList<Entry> mSeasonYValuesAmmonia;
private LineChart lc_history_temperature;
private LineChart lc_history_humidity;
private LineChart lc_history_ammonia;
private RadioButton btn_week;
private RadioButton btn_month;
private RadioButton btn_season;
@Override
protected void onCreate(Bundle bundle) {
// TODO Auto-generated method stub
super.onCreate(bundle);
setContentView(R.layout.activity_history);
sensorCode = getIntent().getExtras().getString("sensorCode");
// 初始化ActionBar
setBackable(true);
setRightImageVisible(false);
setTitle("历史数据");
btn_week = (RadioButton) findViewById(R.id.btn_week);
btn_week.setOnCheckedChangeListener(this);
btn_month = (RadioButton) findViewById(R.id.btn_month);
btn_month.setOnCheckedChangeListener(this);
btn_season = (RadioButton) findViewById(R.id.btn_season);
btn_season.setOnCheckedChangeListener(this);
// 温度
lc_history_temperature = (LineChart) findViewById(R.id.lc_history_temperature);
// 湿度
lc_history_humidity = (LineChart) findViewById(R.id.lc_history_humidity);
// 氨气浓度
lc_history_ammonia = (LineChart) findViewById(R.id.lc_history_ammonia);
endDate = DateTools.getDateDaysBefore(0);
weekReportStartDate = DateTools.getDateDaysBefore(7);
monthReportStartDate = DateTools.getDateDaysBefore(30);
seasonReportStartDate = DateTools.getDateDaysBefore(365);
if (!TextUtils.isEmpty(sensorCode)) {
new GetHistoryTask(seasonReportStartDate, endDate).execute();
}
mWeekXValues = new ArrayList<String>();
mWeekYValuesTemperature = new ArrayList<Entry>();
mWeekYValuesHumidity = new ArrayList<Entry>();
mWeekYValuesAmmonia = new ArrayList<Entry>();
mMonthXValues = new ArrayList<String>();
mMonthYValuesTemperature = new ArrayList<Entry>();
mMonthYValuesHumidity = new ArrayList<Entry>();
mMonthYValuesAmmonia = new ArrayList<Entry>();
mSeasonXValues = new ArrayList<String>();
mSeasonYValuesTemperature = new ArrayList<Entry>();
mSeasonYValuesHumidity = new ArrayList<Entry>();
mSeasonYValuesAmmonia = new ArrayList<Entry>();
mWeatherService = new WeatherService();
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
switch (buttonView.getId()) {
case R.id.btn_week:
// 周报
if (isChecked) {
showHistoryData(1);
}
break;
case R.id.btn_month:
// 月报
if (isChecked) {
showHistoryData(2);
}
break;
case R.id.btn_season:
// 季报
if (isChecked) {
showHistoryData(3);
}
break;
default:
break;
}
}
/**
* 生成一个数据
* @param count 表示图表中有多少个坐标点
* @param range 用来生成range以内的随机数
* @return
*/
private LineData getLineData(List<String> xValues, List<Entry> yValues) {
/*ArrayList<String> xValues = new ArrayList<String>();
for (int i = 0; i < count; i++) {
// x轴显示的数据,这里默认使用数字下标显示
xValues.add("" + i);
} */
ArrayList<LineDataSet> lineDataSets = new ArrayList<LineDataSet>();
// y轴的数据 1======================================start
/* ArrayList<Entry> yValues = new ArrayList<Entry>();
for (int i = 0; i < count; i++) {
float value = (float) (Math.random() * range) + 3;
yValues.add(new Entry(value, i));
}*/
// create a dataset and give it a type
// y轴的数据集合
LineDataSet lineDataSet = new LineDataSet(yValues, "" /*测试折线图*/);
// mLineDataSet.setFillAlpha(110);
// mLineDataSet.setFillColor(Color.RED);
//用y轴的集合来设置参数
// 线宽
lineDataSet.setLineWidth(1.0f);
// 显示的圆形大小
lineDataSet.setCircleSize(2.5f);
// 显示颜色
lineDataSet.setColor(Color.GREEN);
// 圆形的颜色
lineDataSet.setCircleColor(Color.GREEN);
// 高亮的线的颜色
lineDataSet.setHighLightColor(Color.GREEN);
// 设置圆点的颜色
lineDataSet.setFillColor(Color.GREEN);
lineDataSet.setDrawCircleHole(false);
//lineDataSet.setValueTextSize(9f);
lineDataSet.setFillAlpha(65);
lineDataSets.add(lineDataSet);
// y轴的数据 1======================================end
// create a data object with the datasets
LineData lineData = new LineData(xValues, lineDataSets);
return lineData;
}
/**
* 显示数据
* @param lineChart
* @param lineData
* @param color
*/
private void showChart(LineChart lineChart, LineData lineData, int color) {
//是否在折线图上添加边框
lineChart.setDrawBorders(false);
// 数据描述
lineChart.setDescription("");
// 如果没有数据的时候,会显示这个,类似listview的emtpyview
lineChart.setNoDataTextDescription("暂无数据");
// 是否显示表格颜色
lineChart.setDrawGridBackground(false);
// 表格的的颜色,在这里是是给颜色设置一个透明度
//lineChart.setGridBackgroundColor(Color.WHITE & 0x70FFFFFF);
// 设置是否可以触摸
lineChart.setTouchEnabled(true);
// 是否可以拖拽
lineChart.setDragEnabled(true);
// 是否可以缩放
lineChart.setScaleEnabled(true);
// if disabled, scaling can be done on x- and y-axis separately
lineChart.setPinchZoom(false);
//lineChart.setBackgroundColor(Color.rgb(Integer.parseInt("7e", 16), Integer.parseInt("ce", 16), Integer.parseInt("f4", 16)));// 设置背景
// 设置数据
lineChart.setData(lineData);
// 设置比例图标示,就是那个一组y的value的
Legend mLegend = lineChart.getLegend();
//mLegend.setPosition(LegendPosition.BELOW_CHART_CENTER);
// 样式
mLegend.setForm(LegendForm.CIRCLE);
// 字体
mLegend.setFormSize(0f);
// 颜色
mLegend.setTextColor(Color.RED);
// 字体
//mLegend.setTypeface(mTf);
// 设置Y轴右边不显示数字
lineChart.getAxisRight().setEnabled(false);
XAxis xAxis = lineChart.getXAxis();
// 设置X轴的数据显示在报表的下方
xAxis.setPosition(XAxisPosition.BOTTOM);
//xAxis.setDrawAxisLine(false);
// 设置不从X轴发出纵向直线
xAxis.setDrawGridLines(false);
// 立即执行的动画,x轴
lineChart.animateX(2500);
}
/**
* 获取历史记录
* @author Jason
*
*/
private class GetHistoryTask extends AsyncTask<Void, Void, String> {
private String startDate;
private String endDate;
public GetHistoryTask(String startDate, String endDate) {
// TODO Auto-generated constructor stub
this.startDate = startDate;
this.endDate = endDate;
}
@Override
protected String doInBackground(Void... params) {
// TODO Auto-generated method stub
return mWeatherService.getHistory(sensorCode, startDate, endDate, Constant.UserID);
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if (result != null) {
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = null;
try {
jsonNode = mapper.readTree(result);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (jsonNode != null && TextUtils.equals(jsonNode.get("Status").textValue(), ResponseStatus.SUCCESS)) {
// 成功获取到了历史记录
int count = jsonNode.get("Count").asInt();
if (count > 0) {
JsonNode contentNode = jsonNode.get("Content");
for (int i = 0; i < count; i++) {
JsonNode dayNode = contentNode.get(i);
mSeasonYValuesTemperature.add(new Entry(dayNode.get("Temperature").floatValue(), i));
mSeasonYValuesHumidity.add(new Entry(dayNode.get("Humidity").floatValue(), i));
mSeasonYValuesAmmonia.add(new Entry(dayNode.get("Extension1").floatValue(), i));
mSeasonXValues.add(dayNode.get("CollectingTime").textValue().substring(0, 10));
// 解决不显示数据的bug,注意后面的index
if (count - i < 30) {
mMonthYValuesTemperature.add(new Entry(dayNode.get("Temperature").floatValue(), 29-count+i));
mMonthYValuesHumidity.add(new Entry(dayNode.get("Humidity").floatValue(), 29-count+i));
mMonthYValuesAmmonia.add(new Entry(dayNode.get("Extension1").floatValue(), 29-count+i));
mMonthXValues.add(dayNode.get("CollectingTime").textValue().substring(0, 10));
}
if (count - i < 7) {
mWeekYValuesTemperature.add(new Entry(dayNode.get("Temperature").floatValue(), 6-count+i));
mWeekYValuesHumidity.add(new Entry(dayNode.get("Humidity").floatValue(), 6-count+i));
mWeekYValuesAmmonia.add(new Entry(dayNode.get("Extension1").floatValue(), 6-count+i));
mWeekXValues.add(dayNode.get("CollectingTime").textValue().substring(0, 10));
}
}
mTemperatureDataSeason = getLineData(mSeasonXValues, mSeasonYValuesTemperature);
mHumidityDataSeason = getLineData(mSeasonXValues, mSeasonYValuesHumidity);
mAmmoniaDataSeason = getLineData(mSeasonXValues, mSeasonYValuesAmmonia);
mTemperatureDataMonth = getLineData(mMonthXValues, mMonthYValuesTemperature);
mHumidityDataMonth = getLineData(mMonthXValues, mMonthYValuesHumidity);
mAmmoniaDataMonth = getLineData(mMonthXValues, mMonthYValuesAmmonia);
mTemperatureDataWeek = getLineData(mWeekXValues, mWeekYValuesTemperature);
mHumidityDataWeek = getLineData(mWeekXValues, mWeekYValuesHumidity);
mAmmoniaDataWeek = getLineData(mWeekXValues, mWeekYValuesAmmonia);
}
showHistoryData(1);
}
}
}
}
/**
* 切换及展示历史数据
*/
private void showHistoryData(int type) {
switch (type) {
case 1:
showChart(lc_history_temperature, mTemperatureDataWeek, R.color.red_failed);
showChart(lc_history_humidity, mHumidityDataWeek, R.color.red_failed);
showChart(lc_history_ammonia, mAmmoniaDataWeek, R.color.red_failed);
break;
case 2:
showChart(lc_history_temperature, mTemperatureDataMonth, R.color.red_failed);
showChart(lc_history_humidity, mHumidityDataMonth, R.color.red_failed);
showChart(lc_history_ammonia, mAmmoniaDataMonth, R.color.red_failed);
break;
case 3:
showChart(lc_history_temperature, mTemperatureDataSeason, R.color.red_failed);
showChart(lc_history_humidity, mHumidityDataSeason, R.color.red_failed);
showChart(lc_history_ammonia, mAmmoniaDataSeason, R.color.red_failed);
break;
default:
break;
}
}
}
相关推荐
[LaTeX] 调整参考文献的格式(References),包括作者名缩写,行距,字体,引用顺序等等
在此记录我对LaTeX中参考文献references的尝试,主要涵盖如题几个方面。
android条形图,MPAndroid组条形图未显示
这个问题已经在这里有了答案:????????????>????????????How to check if activity is in foreground or in visible background?????????????????????????????????????22个这是我用于使用MPAndroid库版本3的组bar_chart的代码.此代码不起作用.没有崩溃和错误日志...
深入解析TOM模块的PWM输出与ADC触发机制:从配置到DMA数据传输
本文深入解析了TOM模块在嵌入式系统中的核心应用,详细阐述了如何配置其PWM输出功能,并实现与ADC模块的硬件触发同步。重点介绍了通过DMA机制高效传输ADC采样数据的完整流程,涵盖时钟配置、工作模式选择、引脚映射及联调实战,为电机控制、数字电源等实时系统提供了一套硬件自动化的高效解决方案。
MPAndroidChart 折线图只有一个数据显示问题
MPAndroidChart是一个Android图表类框架,十分强大,GitHub地址:https://github.com/PhilJay/MPAndroidChart。 最近在使用LineChart折线图的时候,发现当折线图数据只有一个时,不会画出折线,还不显示圆圈点。所以最后搞了好久终于解决了:就是当折线图数据只有一个时,显示一个点。具体代码如下: /** * initL...
什么是PON(无源光纤网络)、PON的发展及演进
全球知名媒体Omdia在光纤和铜缆接入设备预测报告中对2022年2月的预测显示,PON设备端口收入预计在2020年至2027年期间以12.3%的年复合增长率增长,到2027年将达到163亿美元,远高于2020年的82亿美元。 此前,Omdia有份报告称,在3月份举行的美国OFC展会中,众多 CSP 正在顺利部署 XGS PON(10G 对称),其他 CSP 专注于基于 GPON 的低速 FTTH 服务。另外关于25G PON 和 50G PON 之间的争论仍在继续,而Omdia 认为 25G PON 和 5
STM32 HAL PWM (占空比) -电机软启动不到位解决
为了避免电机启动电压大造成设备损坏,或者供电不足导致重启,通常在对启动都需要一个PWM进行软启动,下面对PWM电机软启动详细介绍。
解决MPAndroidChart的水平柱状图HorizontalBarChart,柱形上的数字无法显示问题
两边的y轴都要设置最大最小值。在HorizontalBarChart中有上下两个y轴,在一般的开发中我们通常都只希望显示一侧的y轴,如果按照之前的做法直接将另外的一个y轴setEnabled(false)的话,就会出现在柱块上无法显示本文的问题。但是最大值有时并不好设置,数据是随机的,设置的太大或者太小都不合适。所以可以取数据的最大值*1.1,作为y轴的最大值。用了各种方法,柱形上的数字都不显示。然后发现一篇文章可以解决这个问题。
基于逆向工程的中国裁判文书网爬虫技术深度解析:从反爬破解到合规抓取
最近承接了一个法律大数据分析的项目,需要获取某类合同纠纷的裁判文书数据,用于分析不同地区的判决规律、法官的裁判倾向以及法条适用情况。原本以为用常规的Python爬虫就能搞定,结果刚对着中国裁判文书网发了几个请求,就遭遇了“滑铁卢”:要么请求直接返回403 Forbidden,要么触发滑块验证码,甚至连IP都被临时封禁了。普通的requests+BeautifulSoup组合在裁判文书网面前完全失效,这也让我意识到,想要获取这里的数据,必须先通过逆向工程拆解网站的请求逻辑和反爬机制。经过一周的摸索,从抓包分析
android MPchart 折现图只有一个点不显示问题
最近做的项目中需要使用图表,集成了 MPchart 使用折线图展现数据趋势 发现当返回的datalist只有一条数据的时候 图表不显示 debug后 发现 x轴格1式化 数据的时候 方法如下 @Override public String getFormattedValue(float value, AxisBase axis) { int position = (int) va
2、MOSFET基本物理效应及其BSIM4模型解析
本文深入探讨了MOSFET的基本物理效应及其在BSIM4模型中的数学表述,涵盖门和沟道的几何结构、温度依赖性、材料模型选项、阈值电压计算、以及其他关键物理效应如LDD电阻、有限电荷厚度、有效迁移率等。同时解析了机械应力、邻近效应及布局依赖效应对MOSFET性能的影响,并通过参数表和建模流程提供了精确建模的指导,旨在帮助读者优化MOSFET器件性能与可靠性。
高项备考论文:规划绩效域
高项备考论文:规划绩效域
Android 解决ViewPager+Fragment切换显示不出MpAndroidChart折线图数据问题
Android 解决ViewPager+Fragment切换显示不出MpAndroidChart折线图数据问题问题分析:数据提交问题,lineChart.invalidate();这个问题我查了半天自己解决了解决方法:在每次加载完数据,设置完图表最后(记住是最后),加上一条lineChart.invalidate();这样在每次切换Viewpager的时候都会再次生产一次图表,所以,图表就不会出现...
CDR插件开发之CPG插件017 - 在VS2019中实现CPG插件调试(自动写入CPG、自动启动CDR)
在上篇文章中,讲解了图像导出实例:当文档打开后,自动导出当前页面的图像到系统临时文件夹。在代码编写过程中,导出图像路径变量tmpFileName 被修改了很多次,有没有办法实现调试功能,通过控制台打印变量,而不用编译成CPG后再通过消息框来调试?当然是可以的。本篇作为单独篇,以CDR X8版本为例,讲解CPG插件在VS2019中实现调试的具体方法。 工程搭建准备 按照惯例,本篇文章的序号为017,请直接拷贝上一个工程016-export-image(拷贝前最好清理掉 Debug、x64等编译目录..
Android图表 MPAndroidChart折线图
1.介绍MPAndroidChart GitHub地址 MPAndroidChart的强大之处就不在多说了,目前最新的版本是3.0.1,在新版本中很多方法都被弃用了,这个要注意一下,在网上查到的大多数资料都是关于旧版本的,今天来实现一下折线图,把过程记录下来,分享给大家。效果图:2.引入开源库 在项目根目录的build.gradle文件中加入如下代码 allprojects { repos
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
MPAndroidChart中MyMarkerView设置不显示问题
原因:// 不显示定位线 lineDataSet.setHighlightEnabled(true);当这个属性设为false时,MarkerView不显示解决:1,把这个属性设为ture2.如果不想显示定位线,可以将定位线的颜色设为透明...
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
安卓 多次异步请求数据后使用 MPAndroidChart 绘图问题
2.现在主页面中获取对应数据后发给它(本文的柱状图是绘制在fragment中的)1.使用线程等待,将异步线程在得到数据后等待,在所有线程都得到数据后一起绘制。binding.BarChart.setNoDataText("暂无数据~")可以看见原本想的是每次获取数据后都绘制一次就可以了,但这样它一次都不画。binding.BarChart.setNoDataText("暂无数据~")binding.BarChart.clear()// 清空。//数据集赋值给数据对象。//数据添加到数据集。
MPAndroidChart显示No data available
网络请求返回数据后设置到chart中,但是一直显示no data available。跳转到其它页面再返回显示正常。在设置数据后需要手动调用view的invalidate方法刷新chart。
【Android】MPAndroidCharta显示 No data available
在接口返回数据后,将数据设置到chart中,区域不显示chart只显示 no data available。
MPAndroidChart 教程:动态和实时数据 Dynamic & Realtime Data(八)
其余文章索引: MPAndroidChart 教程:概述 MPAndroidChart 教程:开始 Getting Started(一) MPAndroidChart 教程:与图表进行手势交互 Interaction with the Chart(二) MPAndroidChart 教程:坐标轴,X轴,Y轴,Labels(三) MPAndroidChart 教程:设置数据,设置
解决MPAndroidChart-LineChart清除数据刷新后X轴取值不准确的问题
直接点击查看解决办法由于项目需要使用表格,于是在Github上搜索到了一个比较好的开源控件。现在我想实现一个表格,表格上每隔几秒增加一个点,表格上只会显示10条数据,所以效果就像动态更新数据一样,每加一个点,X轴像左移动一个点。但是我现在想加一个Button,每次点击后就清除掉LineChart中的DataSet,然后重新设置一个DataSet,重新加载数据。也就是说X轴重新从0开始,但是就在这个时
MPAndroidChart 教程学习笔记
MPAndroidChart 博客链接 MPAndroidChart 教程 moveViewTo(…) 方法会自动调用 invalidate() 动态添加或移除数据后, 调用invalidate()刷新图表之前, 必须调用 notifyDataSetChanged() - ...
【Android】使用MPAndroidChart过程中BarChart的几点心得
1.MPAndroidChart接入 //MPAndroidChart implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' 2.设置数据加载动画 mBarChart.animateXY(1000, 1000); 首先需要说的是上面这行代码是所有博客和文档里面都提到的,通过该方法可以设置数据加载动画。但是在实际使用...
MPAndroidChart踩坑总结
1、界面不刷新 line_chart.getData().notifyDataChanged() line_chart.notifyDataSetChanged() 如果不刷新界面,再调用 line_chart.invalidate() 2、BarChart显示指定个数柱形 val xAxis = bar_chart.getXAxis() xAxis.labelCount = 10 val y...
4万+



被折叠的 条评论
为什么被折叠?



