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



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<String> xVals = new ArrayList<String>();
		for (int i = 0; i < count; i++) {
			xVals.add("某月" + (i + 1) + "日");
		}

		ArrayList<Entry> yHigh = new ArrayList<Entry>();
		LineDataSet high = new LineDataSet(yHigh, "高温");
		setHighTemperature(high, yHigh, count);

		ArrayList<Entry> yLow = new ArrayList<Entry>();
		LineDataSet low = new LineDataSet(yLow, "低温");
		setLowTemperature(low, yLow, count);

		ArrayList<LineDataSet> dataSets = new ArrayList<LineDataSet>();
		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<Entry> 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<Entry> 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 :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

	<com.github.mikephil.charting.charts.LineChart
        android:id="@+id/chart"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

运行结果如图:

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。转载请注明出处:http://blog.csdn.net/zhangphil

时间: 2024-10-10 01:12:31

Android实现天气预报温度/气温折线趋势图的相关文章

Android 常用效果(各种进度条,酷炫loading动画,火箭升空,撒花以及趋势图)

最近时间比较充裕一些,总结了下几个项目用到的ui效果,在这边共享给大家,也给自己做个记录(后面会有demo贴出). 主要是以下几种ui效果: 进度条多种展示 开源loading动画 火箭升空 撒花效果(仿微信) 气温趋势图 一.进度条 这边主要是有四种进度条展示,具体效果请往下看: 二.开源loading动画 这边有两种动画,来自于网上的开源demo,第一种是市场上app的比较常见动画,第二种是新版58的加载动画,具体效果请往下看: 三.火箭升空 这是在公司的一键清理项目中用到的一个动画,主要是

android趋势图创建与使用

之前项目需求里有一个需求是要根据每周的天气温度去绘制一个趋势图,这个图不基于XY坐标,就是一个单纯的趋势图,百度后看了一些博客,大体上有了一些思路,下面是整个趋势图的效果图: 最下面的点线图就是要做的效果. 下面贴出趋势图示例代码: package com.example.testxyjar; import utils.XYViewDrawBitmap; import utils.XYViewDrawLine; import utils.XYViewDrawPointer; import uti

Android图表库MPAndroidChart(八)——饼状图的扩展:折线饼状图

Android图表库MPAndroidChart(八)--饼状图的扩展:折线饼状图 我们接着上文,饼状图的扩展,增加折现的说明,来看下我们要实现的效果 因为之前对MPAndroidChart的熟悉,所有我们就可以直接来实现了 一.基本实现 首先,就是我们的来看下他的定义布局 <com.github.mikephil.charting.charts.PieChart android:id="@+id/mPieChart" android:layout_width="mat

android 趋势图

效果图 思路: 自定义视图继承View,在onDraw()函数中绘制点和线 获取视图的高度,将视图区分为指定的趋势值, 例如,我们的销售业绩从0-10,分为10个阶段,那么就用视图的高度/10,然后根据指定的状态数组来绘制点的位置,然后线连接点 趋势视图代码: public class LineView extends View { //点之间的距离    private int xUnit = 50; //视图的高度    private int height; //默认的趋势单位    pr

Android实战--天气预报(API+JSON解析)

学习安卓有一段时间了,应该提高自己的实战能力,做一些简单的Demo.下面我们介绍一下如何利用网络API实现天气预报功能,主要涉及到如何利用API获得网络数据,网络数据返回一般是JSON格式,这里又涉及到JSON的解析问题,这些都是比较基础的问题,应该予以掌握. 首先在http://apistore.baidu.com/?qq-pf-to=pcqq.c2c找到你想要的API,这里我们选择http://apistore.baidu.com/astore/serviceinfo/1798.html,网

【开源】专业K线绘制[K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等)

这是最近一个iOS项目需要使用的K线的绘制,在网上大量查阅资料无果,只好自行绘制. 实时数据使用来源API: https://www.btc123.com/kline/klineapi 返回数据说明: 1.时间戳 2.开盘价 3.最高价 4.最低价 5.收盘价 6.成交量 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://github.com/yate1996/Y_KLine,如果帮到了你,麻烦

Android Zxing调整扫描区域 优化取图速度

Zxing 是google提供的二维码扫描project Demo本身默认的扫图区域最大仅仅有 360*480    须要拉开非常远的距离才干将整个二维码扫描到 因此须要我们自己调整取图大小 在CameraManager.java这个类中进行调整 默认的大小是 下面这4个參数 // private static final int MIN_FRAME_WIDTH = 240; // private static final int MIN_FRAME_HEIGHT = 240; // priva

[原]零基础学习SDL开发之在Android使用SDL2.0显示BMP叠加图

关于如何移植在android上使用SDL,可以参考[原]零基础学习SDL开发之移植SDL2.0到Android 和 [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 . 在一篇文章我们主要使用SDL2.0来加载一张BMP图来渲染显示,同时叠加一张图作为背景图. 博主的开发环境:Ubuntu 14.04 64位,Eclipse + CDT + ADT+NDK 在前面两篇文章我们知道了如何移植SDL2.0到android上面来,并且可以在Android上面来显示一张图片,这篇

echart折线堆叠图 Y轴数据不堆叠

<!DOCTYPE html> <html> <head></head> <body>     <div class="row form-inline form-ranking">     <div class="form-group">         <label class="control-label">店铺:</label>