Android实现天气预报温度/气温折线趋势图

天气预报的APP应用中,难免会遇到绘制天气温度/气温,等关于数据趋势的折线或者曲线图,这类关于气温/温度的折线图,一般会有两条线,一条是高温线,一条是低温线。

我之前介绍了一个Android平台上第三方开源框架的统计图表库MPAndroidChart(文章链接地址:http://blog.csdn.net/zhangphil/article/details/47656521 ),具体使用方法详情请看这篇文章。

现在基于Android平台上的MPAndroidChart实现气温/温度折线图。

主Activity:MainActivity.java的全部代码:

package zhangphil.chart;

import java.text.DecimalFormat;

import java.util.ArrayList;

import android.app.Activity;

import android.graphics.Color;

import android.os.Bundle;

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.Legend.LegendPosition;

import com.github.mikephil.charting.components.XAxis;

import com.github.mikephil.charting.components.XAxis.XAxisPosition;

import com.github.mikephil.charting.components.YAxis;

import com.github.mikephil.charting.components.YAxis.AxisDependency;

import com.github.mikephil.charting.data.Entry;

import com.github.mikephil.charting.data.LineData;

import com.github.mikephil.charting.data.LineDataSet;

import com.github.mikephil.charting.utils.ValueFormatter;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

LineChart mChart = (LineChart) findViewById(R.id.chart);

setChart(mChart);

// 制作5个数据点。

setData(mChart, 5);

Legend l = mChart.getLegend();

l.setForm(LegendForm.LINE);

l.setTextSize(12f);

l.setTextColor(Color.BLACK);

l.setPosition(LegendPosition.BELOW_CHART_CENTER);

XAxis xAxis = mChart.getXAxis();

// 将X坐标轴的标尺刻度移动底部。

xAxis.setPosition(XAxisPosition.BOTTOM);

// X轴之间数值的间隔

xAxis.setSpaceBetweenLabels(1);

xAxis.setTextSize(12f);

xAxis.setTextColor(Color.BLACK);

YAxis leftAxis = mChart.getAxisLeft();

setYAxisLeft(leftAxis);

YAxis rightAxis = mChart.getAxisRight();

setYAxisRight(rightAxis);

}

private void setChart(LineChart mChart) {

mChart.setDescription("@ http://blog.csdn.net/zhangphil");

mChart.setNoDataTextDescription("如果传递的数值是空,那么你将看到这段文字。");

mChart.setHighlightEnabled(true);

mChart.setTouchEnabled(true);

mChart.setDragDecelerationFrictionCoef(0.9f);

mChart.setDragEnabled(true);

mChart.setScaleEnabled(true);

mChart.setDrawGridBackground(true);

mChart.setHighlightPerDragEnabled(true);

mChart.setPinchZoom(true);

mChart.setBackgroundColor(Color.LTGRAY);

mChart.animateX(3000);

}

private void setYAxisLeft(YAxis leftAxis) {

// 在左侧的Y轴上标出4个刻度值

leftAxis.setLabelCount(4, true);

// Y坐标轴轴线的颜色

leftAxis.setGridColor(Color.RED);

// Y轴坐标轴上坐标刻度值的颜色

leftAxis.setTextColor(Color.RED);

// Y坐标轴最大值

leftAxis.setAxisMaxValue(50);

// Y坐标轴最小值

leftAxis.setAxisMinValue(10);

leftAxis.setStartAtZero(false);

leftAxis.setDrawLabels(true);

}

private void setYAxisRight(YAxis rightAxis) {

// Y坐标轴上标出8个刻度值

rightAxis.setLabelCount(8, true);

// Y坐标轴上刻度值的颜色

rightAxis.setTextColor(Color.BLUE);

// Y坐标轴上轴线的颜色

rightAxis.setGridColor(Color.BLUE);

// Y坐标轴最大值

rightAxis.setAxisMaxValue(30);

// Y坐标轴最小值

rightAxis.setAxisMinValue(-5);

rightAxis.setStartAtZero(false);

rightAxis.setDrawLabels(true);

}

private void setData(LineChart mChart, int count) {

ArrayList xVals = new ArrayList();

for (int i = 0; i < count; i++) {

xVals.add("某月" + (i + 1) + "日");

}

ArrayList yHigh = new ArrayList();

LineDataSet high = new LineDataSet(yHigh, "高温");

setHighTemperature(high, yHigh, count);

ArrayList yLow = new ArrayList();

LineDataSet low = new LineDataSet(yLow, "低温");

setLowTemperature(low, yLow, count);

ArrayList dataSets = new ArrayList();

dataSets.add(high);

dataSets.add(low);

LineData data = new LineData(xVals, dataSets);

data.setValueTextColor(Color.DKGRAY);

data.setValueTextSize(10f);

mChart.setData(data);

}

private void setHighTemperature(LineDataSet high, ArrayList yVals,

int count) {

for (int i = 0; i < count; i++) {

float val = (float) Math.random() + 30;

yVals.add(new Entry(val, i));

}

// 以左边的Y坐标轴为准

high.setAxisDependency(AxisDependency.LEFT);

high.setLineWidth(5f);

high.setColor(Color.RED);

high.setCircleSize(8f);

high.setCircleColor(Color.YELLOW);

high.setCircleColorHole(Color.DKGRAY);

high.setDrawCircleHole(true);

// 设置折线上显示数据的格式。如果不设置,将默认显示float数据格式。

high.setValueFormatter(new ValueFormatter() {

@Override

public String getFormattedValue(float value) {

DecimalFormat decimalFormat = new DecimalFormat(".0");

String s = "高温" + decimalFormat.format(value);

return s;

}

});

}

private void setLowTemperature(LineDataSet low, ArrayList yVals,

int count) {

for (int i = 0; i < count; i++) {

float val = (float) Math.random() + 5;

yVals.add(new Entry(val, i));

}

// 以右边Y坐标轴为准

low.setAxisDependency(AxisDependency.RIGHT);

// 折现的颜色

low.setColor(Color.GREEN);

// 线宽度

low.setLineWidth(3f);

// 折现上点的圆球颜色

low.setCircleColor(Color.BLUE);

// 填充圆球中心部位洞的颜色

low.setCircleColorHole(Color.LTGRAY);

// 圆球的尺寸

low.setCircleSize(5f);

low.setDrawCircleHole(true);

low.setValueFormatter(new ValueFormatter() {

@Override

public String getFormattedValue(float value) {

DecimalFormat decimalFormat = new DecimalFormat(".0");

String s = "低温" + decimalFormat.format(value);

return s;

}

});

}

}

MainActivity.java需要的布局文章activity_main.xml :

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:id="@+id/chart"

android:layout_width="match_parent"

android:layout_height="match_parent" />

运行结果如图:

需要对MPAndroidChart的坐标体系加以说明。MPAndroidChart的Y纵坐标轴分为左右两条纵坐标:左纵坐标轴(chart的getAxisLeft()获得的YAxis)和右纵坐标轴(chart的getAxisRight()获得的YAxis)。虽然它们都是MPAndroidChart中的Yaxis一个类代表,但它们在具体使用中是相互独立的,但它们共用X坐标轴(横坐标)。

比如在本例中,左边的红色Y纵坐标轴独立代表高温折线,它有自己独立运行的一套绘图机制;同理,右边蓝色Y纵坐标轴独立代表的低温折线,它也有自己独立运行的一套绘图机制。不要将两者混为一谈。

java如何绘制温度实时曲线_Android实现天气预报温度/气温折线趋势图相关推荐

  1. vb实时曲线的绘制和保存

    在VB中绘制实时曲线是比较难的,一般要应用第三方控件或是Windows API函数来完成,但是如果你对实时曲线的要求不是很高,只要能表示出当前的一般情况的话,我们可以直接应用VB提供给我们的空间来完成 ...

  2. 实时曲线 温湿度表_温度/湿度一目了然,米家蓝牙温湿度计使用体验

    每年的6月雨季,杭州的"黄梅天"(梅雨季)都会如约而至,因为正值杨梅成熟的采摘季,因此而得名.黄梅天最直接的感受就是如同置身温室当中,闷.热.潮交织在一起,相当的难受.而我们生活的 ...

  3. teechart绘制实时曲线_基于OpenCV的显著图绘制

    显着性是图像的突出部分,我们的大脑会特别关注这个部分.上图突出了我们在看到一个场景或图像时会注意到的部分.例如,大家有没有曾经在看广告的时候被一些特别的内容吸引,为此我们还特意停下来多看了一会儿?这就 ...

  4. 振弦采集模块配置工具VMTool 扩展功能指令生成器与实时曲线

    振弦采集模块配置工具VMTool 扩展功能指令生成器与实时曲线 指令生成器 ( 1) 指令生成 指令生成器可根据需要生成符合 MODBUS 和 AABB 通讯协议的读取和控制指令. 通过点击串口调试工 ...

  5. 用计算机控制检测实时温度,温度实时测量及控制系统.doc

    温度实时测量及控制系统 摘要 文中的设计电路以AT89C52单片机作为控制器.主要由键盘输入电路.温度测量电路.输出显示电路和电动机控制电路四部分.吸收了硬件软件化的思想,大部分功能通过软件来实现,使 ...

  6. STM32连续采样_STM32 - 利用双缓冲实现实时曲线显示(续)

    前言 大概半个月之前捣鼓了下利用STM32实现实时曲线显示,中间又做了一点小改进和扩充,在这里更新一下: 利用DMA进行缓冲区到LCD GRAM的像素数据搬运 效果更好的曲线绘制策略 代码可以在这里找 ...

  7. chart控件做实时曲线显示_组态王实时趋势曲线控件介绍,让你对此不再陌生

    一.组态王实时趋势控件的特点 1. 通过TCPIP获得实时数据,数据服务器可以是任何一台运行组态王的机器,而不需进行组态王网络配置. 2. 最多可以显示20条曲线. 3. 可以设置每条曲线的绘制方式, ...

  8. (一)QCustomPlot常见属性设置、多曲线绘制、动态曲线绘制、生成游标、矩形放大等功能实现

    系列文章目录 提示:这里是该系列文章的所有文章的目录 第一章: (一)QCustomPlot常见属性设置.多曲线绘制.动态曲线绘制.生成游标.矩形放大等功能实现 第二章: (二)QCustomPlot ...

  9. Qt串口通信实时曲线上位机源代码

    Qt串口通信实时曲线上位机源代码 带用户配置保存 数据保存带有坐标轴缩放 拖动平移放大等功能,提供,提供源代码,注释,软件文档使用说明,可进行二次开发 通过定时发送获取数据,并将接收的数据采用Qt自带 ...

最新文章

  1. 程序员吐槽:去再好的互联网公司也就是个打工仔,还累出一身病
  2. 集存款(复利单利)贷款为一体的计算器(最新版)
  3. 还有什么芯片没涨?ST、ON、Microchip、Xilinx、东芝开启新一轮涨价潮
  4. 转:在eclipse中搭建maven工程(第二种方法)
  5. git通过指令查看某一个已经修改的文件的改动
  6. 桂电在linux、Mac OS环境下使用出校器(支持2.14)
  7. SpringBoot集成MyBatis详解
  8. mat查找多线程并发下大对象导致的堆内存问题
  9. 电脑教程从入门到精通_【电路仿真】视频教程资料包,proteus入门到精通+实例教程+软件,免费下载!...
  10. 【合集】高等数学随堂笔记-苏德矿老师-部分内容汇总
  11. 【Android】面试宝典
  12. vue-cli 项目打包后 代理接口报404错误 解决办法!
  13. 时间煮雨,人生浅笑嫣然
  14. LARS算法的几何意义
  15. java连接MQTT服务器(Springboot整合MQTT)
  16. 鸿蒙系统可以跟ios媲美吗,任正非再次确认:不需要2年,鸿蒙系统就可以媲美ios系统...
  17. redis stream持久化_[灌水] Redis 的持久化
  18. 更改CloudStack中KVM平台的Windows虚拟机默认磁盘类型为VirtIO
  19. 星空深蓝色系新品项目发布会PPT模板
  20. HTML特殊符号(字符实体)大全

热门文章

  1. android ui框架详解,多图详解 “Android UI”设计官方教程(二)
  2. myrio与fpga编程_【虚拟课堂】LabVIEW与MyRIO的逐点比较法插补实现(含FPGA)
  3. 车辆智能称重管理系统是什么
  4. [ZZ]Windows磁盘驱动基础教程
  5. 层次分析法和熵值法经典实操案例+数据
  6. 简单计算器的实现java_java实现简单计算器
  7. Javaweb人才招聘系统
  8. 几种滤波器的比较(巴特沃斯、切比雪夫、贝塞尔滤波器)
  9. 计算机绘图三号图纸,江苏开放大学计算机绘图形考3
  10. 应届生报考MEM时要注意了!非全不是你的菜!