Android开发之初级开发_利用第三方架包绘制折线图
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.app.Activity; import android.content.Context; import android.graphics.Color; import android.graphics.Paint.Align; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; public class CO2LineAchart extends Activity { private Timer timer = new Timer(); private TimerTask task; private Handler handler; private String title = "CO2浓度折线图"; private XYSeries series; 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]; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.colineachart); context = getApplicationContext(); // 这里获得main界面上的布局,下面会把图表画在这个布局里面 LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout1); // 这个类用来放置曲线上的所有点,是一个点的集合,根据这些点画出曲线 series = new XYSeries(title); series = new XYSeries(title); // 创建一个数据集的实例,这个数据集将被用来创建图表 mDataset = new XYMultipleSeriesDataset(); // 将点集添加到这个数据集中 mDataset.addSeries(series); // 以下都是曲线的样式和属性等等的设置,renderer相当于一个用来给图表做渲染的句柄 int color = Color.GREEN; PointStyle style = PointStyle.CIRCLE; renderer = buildRenderer(color, style, true); // 设置好图表的样式 setChartSettings(renderer, "X", "Y", 0, 100, 0, 90, 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 public 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); // 设置X.Y坐标原点位置及其最大值 renderer.setXAxisMin(xMin); renderer.setXAxisMax(xMax); renderer.setYAxisMin(yMin); renderer.setYAxisMax(yMax); // 设置坐标线颜色 renderer.setAxesColor(axesColor); renderer.setLabelsColor(labelsColor); // 设置是否显示网格 renderer.setShowGrid(true); // 设置曲线颜色 renderer.setGridColor(Color.GREEN); // 设置X,Y坐标间隔大小 renderer.setXLabels(20); // 设置是否可以滑动及其缩放 renderer.setClickEnabled(true); renderer.setYLabels(10); // 设置X轴标题 renderer.setXTitle("时间"); // 设置Y轴标题 renderer.setYTitle("浓度"); renderer.setYLabelsAlign(Align.RIGHT); // 设置曲线大小 renderer.setPointSize((float) 4); // 是否显示图例 renderer.setShowLegend(false); } private void updateChart() { // 设置好下一个需要增加的节点 addX = 0; addY = (int) (Math.random() * 90); // 移除数据集中旧的点集 mDataset.removeSeries(series); // 判断当前点集中到底有多少点,因为屏幕总共只能容纳100个,所以当点数超过100时,长度永远是100 int length = series.getItemCount(); if (length > 100) { length = 100; } // 将旧的点集中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(); } }
<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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.hql.MainActivity$PlaceholderFragment" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="500dp" /> </LinearLayout> </RelativeLayout>
<activity android:name="com.topcsa.hql.CO2LineAchart" android:screenOrientation="landscape" />
//首先我们要用到的是第三方架包:achartengine-1.1.0
//下载地址网上百度即可。
// 1.将架包复制到我们项目的libs目录下
// 2.build path中将架包调到Android x.x下面
// 3.然后将libs中的架包删除。
//如遇到错误,请百度

浙公网安备 33010602011771号