您的位置:首页 > 移动开发 > Android开发

Android统计图表MPAndroidChart:动态添加数据更新【6】

2015-12-05 12:52 513 查看

Android统计图表MPAndroidChart:动态添加数据更新【6】
Android MPAndroidChart的LineDataSet代表一条统计图表中统计折线,一张统计图表可以同时存在若干条统计折线,其在内存中存储的模型类型数组,从0开始下标。

动态的往MPAndroidChart添加数据,就是增加往LineData里面增加Entry。

写一个例子加以说明。

先写一个LineChart布局,顶部的Button每点一次增加一个数据点:

<LinearLayout 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"
android:orientation="vertical"
tools:context="zhangphil.chart.MainActivity" >

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="动态添加数据" />

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

</LinearLayout>


Java代码:

package zhangphil.chart;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.XAxis.XAxisPosition;
import com.github.mikephil.charting.components.YAxis.AxisDependency;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.components.Legend.LegendForm;
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.ColorTemplate;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

private LineChart mChart;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

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

mChart.setDescription("Zhang Phil @ http://blog.csdn.net/zhangphil"); mChart.setNoDataTextDescription("暂时尚无数据");

mChart.setTouchEnabled(true);

// 可拖曳
mChart.setDragEnabled(true);

// 可缩放
mChart.setScaleEnabled(true);
mChart.setDrawGridBackground(false);

mChart.setPinchZoom(true);

// 设置图表的背景颜色
mChart.setBackgroundColor(Color.LTGRAY);

LineData data = new LineData();

// 数据显示的颜色
data.setValueTextColor(Color.WHITE);

// 先增加一个空的数据,随后往里面动态添加
mChart.setData(data);

// 图表的注解(只有当数据集存在时候才生效)
Legend l = mChart.getLegend();

// 可以修改图表注解部分的位置
// l.setPosition(LegendPosition.LEFT_OF_CHART);

// 线性,也可是圆
l.setForm(LegendForm.LINE);

// 颜色
l.setTextColor(Color.WHITE);

// x坐标轴
XAxis xl = mChart.getXAxis();
xl.setTextColor(Color.WHITE);
xl.setDrawGridLines(false);
xl.setAvoidFirstLastClipping(true);

// 几个x坐标轴之间才绘制?
xl.setSpaceBetweenLabels(5);

// 如果false,那么x坐标轴将不可见
xl.setEnabled(true);

// 将X坐标轴放置在底部,默认是在顶部。
xl.setPosition(XAxisPosition.BOTTOM);

// 图表左边的y坐标轴线
YAxis leftAxis = mChart.getAxisLeft();
leftAxis.setTextColor(Color.WHITE);

// 最大值
leftAxis.setAxisMaxValue(90f);

// 最小值
leftAxis.setAxisMinValue(40f);

// 不一定要从0开始
leftAxis.setStartAtZero(false);

leftAxis.setDrawGridLines(true);

YAxis rightAxis = mChart.getAxisRight();
// 不显示图表的右边y坐标轴线
rightAxis.setEnabled(false);

// 每点击一次按钮,增加一个点
Button addButton = (Button) findViewById(R.id.button);
addButton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
addEntry();
}
});
}

// 添加进去一个坐标点
private void addEntry() {

LineData data = mChart.getData();

// 每一个LineDataSet代表一条线,每张统计图表可以同时存在若干个统计折线,这些折线像数组一样从0开始下标。
// 本例只有一个,那么就是第0条折线
LineDataSet set = data.getDataSetByIndex(0);

// 如果该统计折线图还没有数据集,则创建一条出来,如果有则跳过此处代码。
if (set == null) {
set = createLineDataSet();
data.addDataSet(set);
}

// 先添加一个x坐标轴的值
// 因为是从0开始,data.getXValCount()每次返回的总是全部x坐标轴上总数量,所以不必多此一举的加1
data.addXValue((data.getXValCount()) + "");

// 生成随机测试数
float f = (float) ((Math.random()) * 20 + 50);

// set.getEntryCount()获得的是所有统计图表上的数据点总量,
// 如从0开始一样的数组下标,那么不必多次一举的加1
Entry entry = new Entry(f, set.getEntryCount());

// 往linedata里面添加点。注意:addentry的第二个参数即代表折线的下标索引。
// 因为本例只有一个统计折线,那么就是第一个,其下标为0.
// 如果同一张统计图表中存在若干条统计折线,那么必须分清是针对哪一条(依据下标索引)统计折线添加。
data.addEntry(entry, 0);

// 像ListView那样的通知数据更新
mChart.notifyDataSetChanged();

// 当前统计图表中最多在x轴坐标线上显示的总量
mChart.setVisibleXRangeMaximum(5);

// y坐标轴线最大值
// mChart.setVisibleYRange(30, AxisDependency.LEFT);

// 将坐标移动到最新
// 此代码将刷新图表的绘图
mChart.moveViewToX(data.getXValCount() - 5);

// mChart.moveViewTo(data.getXValCount()-7, 55f,
// AxisDependency.LEFT);
}

// 初始化数据集,添加一条统计折线,可以简单的理解是初始化y坐标轴线上点的表征
private LineDataSet createLineDataSet() {

LineDataSet set = new LineDataSet(null, "动态添加的数据");
set.setAxisDependency(AxisDependency.LEFT);

// 折线的颜色
set.setColor(ColorTemplate.getHoloBlue());

set.setCircleColor(Color.WHITE);
set.setLineWidth(10f);
set.setCircleSize(5f);
set.setFillAlpha(128);
set.setFillColor(ColorTemplate.getHoloBlue());
set.setHighLightColor(Color.GREEN);
set.setValueTextColor(Color.WHITE);
set.setValueTextSize(10f);
set.setDrawValues(true);
return set;
}
}


运行结果:



相关文章:

 【1】《Android统计图表MPAndroidChart》链接地址:http://blog.csdn.net/zhangphil/article/details/47656521 

【2】《基于Android MPAndroidChart实现腾讯QQ群数据统计报表核心功能》链接地址:http://blog.csdn.net/zhangphil/article/details/47685515 

【3】《Android实现天气预报温度/气温折线趋势图》链接地址:http://blog.csdn.net/zhangphil/article/details/47702245 

【4】《Android统计图表之柱状图(条形图)》链接地址:http://blog.csdn.net/zhangphil/article/details/47727913 

【5】《Android MPAndroidChart之PieChart和数据结构以及模型【5】》链接地址:http://blog.csdn.net/zhangphil/article/details/50172817

【6】MPAndroidChart在github上的项目主页:https://github.com/PhilJay/MPAndroidChart  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: