anroid achartengine折线的示例及问题
来源:互联网 发布:手机淘宝怎么登录卖家 编辑:程序博客网 时间:2024/05/17 06:13
package com.example.achartenginedemo;
import java.util.Timer;
import java.util.TimerTask;
import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint.Align;
/**
* 折线图: 点的最高处画上一个平行x轴垂直y轴的直线,x,y轴随着点的最高值变化
* */
/**
* 点击事件, 然后找到x坐标, 画一条线就可以了, 重写onkeydown事件**/
public class MainActivity extends Activity {
private Timer timer = new Timer();
private TimerTask task;
private Handler handler;
private String title = "线状报表";
private XYSeries series;// 封装图表,放入x轴y轴的值
private XYMultipleSeriesDataset mDataset;// 放入图表的容器。主要放入数据
private GraphicalView chart;// 图表的视图
private XYMultipleSeriesRenderer renderer;// 图表的描绘器
private Context context;
private int addX = -1, addY;
int[] xv = new int[100];
int[] yv = new int[100];
private LinearLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = getApplicationContext();
// 这里获得main界面上的布局,下面会把图表画在这个布局里面
layout = (LinearLayout) findViewById(R.id.linearLayout1);
// 这个类用来放置曲线上的所有点,是一个点的集合,根据这些点画出曲线
series = new XYSeries(title);
// 创建一个数据集的实例,这个数据集将被用来创建图表
mDataset = new XYMultipleSeriesDataset();
// 将点集添加到这个数据集中
mDataset.addSeries(series);
// 以下都是曲线的样式和属性等等的设置,renderer相当于一个用来给图表做渲染的句柄
int color = Color.GREEN;
PointStyle style = PointStyle.CIRCLE;
renderer = buildRenderer(color, style, true);
// 设置好图表的样式,x,y在当前视图的最大值
setChartSettings(renderer, "X", "Y", 0, 8, 0,8, Color.WHITE,
Color.WHITE);
// 生成图表
chart = ChartFactory.getLineChartView(context, mDataset, renderer);
// 将图表添加到布局中去
layout.addView(chart, new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
// 这里的Handler实例将配合下面的Timer实例,完成定时更新图表的功能
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 刷新图表
updateChart();
super.handleMessage(msg);
}
};
task = new TimerTask() {
@Override
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
timer.schedule(task, 500, 500);
}
@Override
protected void onDestroy() {
// 当结束程序时关掉Timer
timer.cancel();
super.onDestroy();
}
protected XYMultipleSeriesRenderer buildRenderer(int color,
PointStyle style, boolean fill) {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
// 设置图表中曲线本身的样式,包括颜色、点的大小以及线的粗细等
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(color);
r.setPointStyle(style);
r.setFillPoints(fill);
r.setLineWidth(3);
renderer.addSeriesRenderer(r);
return renderer;
}
/** 设置图表的样式 ,渲染*/
protected void setChartSettings(XYMultipleSeriesRenderer renderer,
String xTitle, String yTitle, double xMin, double xMax,
double yMin, double yMax, int axesColor, int labelsColor) {
// 有关对图表的渲染可参看api文档
renderer.setChartTitle(title);
renderer.setXTitle(xTitle);
renderer.setYTitle(yTitle);
renderer.setXAxisMin(xMin);
renderer.setXAxisMax(xMax);
renderer.setYAxisMin(yMin);
renderer.setYAxisMax(yMax);
renderer.setAxesColor(axesColor);
renderer.setLabelsColor(labelsColor);
renderer.setShowGrid(true);
renderer.setGridColor(Color.GRAY);
renderer.setXLabels(2);//x轴显示的个数
renderer.setYLabels(2);//y轴显示的个数
renderer.setXTitle("Time");
renderer.setYTitle("dBm");
renderer.setPanEnabled(true, true); //x轴不可拖动,Y轴不可
renderer.setYLabelsAlign(Align.RIGHT);
renderer.setPointSize((float) 2);
renderer.setShowLegend(false);
}
/**更新图表节点
* **/
private void updateChart() {
// 设置好下一个需要增加的节点
addX = 0;
addY = (int) (Math.random()*10);
// 移除数据集中旧的点集
mDataset.removeSeries(series);
// 判断当前点集中到底有多少点,因为屏幕总共只能容纳100个,所以当点数超过100时,长度永远是100
int length = series.getItemCount();
if (length > 8) {
length = 8;
}
// 将旧的点集中x和y的数值取出来放入backup中,并且将x的值加1,造成曲线向右平移的效果
for (int i = 0; i < length; i++) {
xv[i] = (int) series.getX(i) + 1;
yv[i] = (int) series.getY(i);
}
// 点集先清空,为了做成新的点集而准备
series.clear();
// 将新产生的点首先加入到点集中,然后在循环体中将坐标变换后的一系列点都重新加入到点集中
// 这里可以试验一下把顺序颠倒过来是什么效果,即先运行循环体,再添加新产生的点
series.add(addX, addY);
for (int k = 0; k < length; k++) {
series.add(xv[k], yv[k]);
}
// 在数据集中添加新的点集
mDataset.addSeries(series);
// 视图更新,没有这一步,曲线不会呈现动态
// 如果在非UI主线程中,需要调用postInvalidate(),具体参考api
chart.invalidate();
}
import java.util.Timer;
import java.util.TimerTask;
import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint.Align;
/**
* 折线图: 点的最高处画上一个平行x轴垂直y轴的直线,x,y轴随着点的最高值变化
* */
/**
* 点击事件, 然后找到x坐标, 画一条线就可以了, 重写onkeydown事件**/
public class MainActivity extends Activity {
private Timer timer = new Timer();
private TimerTask task;
private Handler handler;
private String title = "线状报表";
private XYSeries series;// 封装图表,放入x轴y轴的值
private XYMultipleSeriesDataset mDataset;// 放入图表的容器。主要放入数据
private GraphicalView chart;// 图表的视图
private XYMultipleSeriesRenderer renderer;// 图表的描绘器
private Context context;
private int addX = -1, addY;
int[] xv = new int[100];
int[] yv = new int[100];
private LinearLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = getApplicationContext();
// 这里获得main界面上的布局,下面会把图表画在这个布局里面
layout = (LinearLayout) findViewById(R.id.linearLayout1);
// 这个类用来放置曲线上的所有点,是一个点的集合,根据这些点画出曲线
series = new XYSeries(title);
// 创建一个数据集的实例,这个数据集将被用来创建图表
mDataset = new XYMultipleSeriesDataset();
// 将点集添加到这个数据集中
mDataset.addSeries(series);
// 以下都是曲线的样式和属性等等的设置,renderer相当于一个用来给图表做渲染的句柄
int color = Color.GREEN;
PointStyle style = PointStyle.CIRCLE;
renderer = buildRenderer(color, style, true);
// 设置好图表的样式,x,y在当前视图的最大值
setChartSettings(renderer, "X", "Y", 0, 8, 0,8, Color.WHITE,
Color.WHITE);
// 生成图表
chart = ChartFactory.getLineChartView(context, mDataset, renderer);
// 将图表添加到布局中去
layout.addView(chart, new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
// 这里的Handler实例将配合下面的Timer实例,完成定时更新图表的功能
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 刷新图表
updateChart();
super.handleMessage(msg);
}
};
task = new TimerTask() {
@Override
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
timer.schedule(task, 500, 500);
}
@Override
protected void onDestroy() {
// 当结束程序时关掉Timer
timer.cancel();
super.onDestroy();
}
protected XYMultipleSeriesRenderer buildRenderer(int color,
PointStyle style, boolean fill) {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
// 设置图表中曲线本身的样式,包括颜色、点的大小以及线的粗细等
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(color);
r.setPointStyle(style);
r.setFillPoints(fill);
r.setLineWidth(3);
renderer.addSeriesRenderer(r);
return renderer;
}
/** 设置图表的样式 ,渲染*/
protected void setChartSettings(XYMultipleSeriesRenderer renderer,
String xTitle, String yTitle, double xMin, double xMax,
double yMin, double yMax, int axesColor, int labelsColor) {
// 有关对图表的渲染可参看api文档
renderer.setChartTitle(title);
renderer.setXTitle(xTitle);
renderer.setYTitle(yTitle);
renderer.setXAxisMin(xMin);
renderer.setXAxisMax(xMax);
renderer.setYAxisMin(yMin);
renderer.setYAxisMax(yMax);
renderer.setAxesColor(axesColor);
renderer.setLabelsColor(labelsColor);
renderer.setShowGrid(true);
renderer.setGridColor(Color.GRAY);
renderer.setXLabels(2);//x轴显示的个数
renderer.setYLabels(2);//y轴显示的个数
renderer.setXTitle("Time");
renderer.setYTitle("dBm");
renderer.setPanEnabled(true, true); //x轴不可拖动,Y轴不可
renderer.setYLabelsAlign(Align.RIGHT);
renderer.setPointSize((float) 2);
renderer.setShowLegend(false);
}
/**更新图表节点
* **/
private void updateChart() {
// 设置好下一个需要增加的节点
addX = 0;
addY = (int) (Math.random()*10);
// 移除数据集中旧的点集
mDataset.removeSeries(series);
// 判断当前点集中到底有多少点,因为屏幕总共只能容纳100个,所以当点数超过100时,长度永远是100
int length = series.getItemCount();
if (length > 8) {
length = 8;
}
// 将旧的点集中x和y的数值取出来放入backup中,并且将x的值加1,造成曲线向右平移的效果
for (int i = 0; i < length; i++) {
xv[i] = (int) series.getX(i) + 1;
yv[i] = (int) series.getY(i);
}
// 点集先清空,为了做成新的点集而准备
series.clear();
// 将新产生的点首先加入到点集中,然后在循环体中将坐标变换后的一系列点都重新加入到点集中
// 这里可以试验一下把顺序颠倒过来是什么效果,即先运行循环体,再添加新产生的点
series.add(addX, addY);
for (int k = 0; k < length; k++) {
series.add(xv[k], yv[k]);
}
// 在数据集中添加新的点集
mDataset.addSeries(series);
// 视图更新,没有这一步,曲线不会呈现动态
// 如果在非UI主线程中,需要调用postInvalidate(),具体参考api
chart.invalidate();
}
}
楼主,有一些问题不够明白,希望有高手不吝赐教~~就是如何让x轴的刻度根据x坐标的大小而改变,如何实现呢??还有就是根据如何根据这个线上的y的坐标上最大值再画一条线,平行于x轴垂直于y轴的,,~~~~~希望给个方法和思路~~~谢谢
0 0
- anroid achartengine折线的示例及问题
- Android之achartengine简单示例(折线的光滑化)
- achartengine画出动态折线图的效果
- 关于自定义的achartengine中的折线图
- 安卓图表引擎AChartEngine示例源码折线图
- 关于AchartEngine中折线图显示点值不全的问题
- AChartEngine画折线图
- achartengine之折线图
- AChartEngine折线图实例
- android achartengine折线图
- achartengine绘制折线图
- AChartEngine折线图实例
- AchartEngine折线图
- 关于 AChartEngine画折线图 的属性设置
- android 绘制折线图(AChartEngine)Linechart静态的
- achartengine画出动态折线图的效果[转]
- AChartEngine画折线图 的属性设置(个人精华版)
- 安卓图表引擎AChartEngine(四) - 源码示例 嵌入Acitivity中的折线图
- Hibernate复习(四)常见的映射类型A
- 写给三十岁的自己
- 今日开始
- 就像菜市场的吆喝
- 林仕鼎:系统架构领域的一些学习材料
- anroid achartengine折线的示例及问题
- 腐败纠葛私生活:海瑞官清因娶妾多?
- storyboard中游离的viewcontroller
- 解决/proc/bus/usb/目录下没有devices文件问题
- Python实现分类,包含解释器种类科普
- TCP协议疑难杂症全景解析
- 椭圆参数记录
- 为什么operator>>(istream&, string&)能够安全地读入长度未知的字符串?
- JDK环境变量配置—Ubuntu