AChartEngine中气泡图

来源:互联网 发布:船舶钢材用量计算法 编辑:程序博客网 时间:2024/05/17 01:55

package com.sprd.chartexample;import java.util.Random;import org.achartengine.ChartFactory;import org.achartengine.chart.BarChart.Type;import org.achartengine.chart.PointStyle;import org.achartengine.model.XYMultipleSeriesDataset;import org.achartengine.model.XYSeries;import org.achartengine.model.XYValueSeries;import org.achartengine.renderer.XYMultipleSeriesRenderer;import org.achartengine.renderer.XYSeriesRenderer;import android.app.Activity;import android.content.Intent;import android.graphics.Color;import android.graphics.Paint.Align;import android.os.Bundle;public class MainActivity extends Activity {public static final String TYPE = "type";private XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();private XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 饼图// Intent pie = new APieChartExample().execute(this);// startActivity(pie);// 折线图// Intent line = new ALineChartExample().execute(this);// startActivity(line);// 柱状图// Intent bar = new ABarChartExample().execute(this);// startActivity(bar);// 构建数据// 设置图表显示的位置mRenderer.setMargins(new int[] { 30, 30, 30, 30 });// 设置图表的X轴处于水平方向还是垂直方向mRenderer.setOrientation(XYMultipleSeriesRenderer.Orientation.HORIZONTAL);mRenderer.setXTitle("时间");// 设置为X轴的标题mRenderer.setYTitle("百分比");// 设置Y轴的标题mRenderer.setAxisTitleTextSize(20);// 设置轴标题文本大小mRenderer.setChartTitle("Cpu Load");// 设置图表标题mRenderer.setChartTitleTextSize(30);// 设置图表标题文字的大小mRenderer.setLabelsTextSize(22);// 设置标签的文字大小 ,刻度文本的大小// mRenderer.setLegendTextSize(20);//设置图例文本大小mRenderer.setPointSize(1f);// 设置点的大小mRenderer.setYAxisMin(0);// 设置y轴最小值是0mRenderer.setYAxisMax(50); // 设置Y轴最大值为100mRenderer.setYLabels(5);// 设置Y轴刻度个数(貌似不太准确)mRenderer.setYLabelsAlign(Align.RIGHT);// y轴字体对齐方式mRenderer.setYLabelsPadding(5);// y轴的间距mRenderer.setYLabelsVerticalPadding(-5); // y轴标签垂直间距mRenderer.setYLabelsAngle(-45);// 标签倾斜的角度mRenderer.setXLabelsPadding(5); // x轴标签间距mRenderer.setXAxisMax(10); // x轴最大值mRenderer.setXLabelsAngle(-45);// x标签倾斜的角度mRenderer.setXLabelsAlign(Align.CENTER);mRenderer.setShowGrid(true);// 显示网格mRenderer.setPanEnabled(false, false);// 设置拖动属性,第一个参数为左右是否可拖动,第二个参数为上下是否可拖动mRenderer.setApplyBackgroundColor(true);// 允许设置背景颜色mRenderer.setBackgroundColor(Color.BLACK);// 设置为黑色// mRenderer.setClickEnabled(true);//设置了之后,不可再拖动// mRenderer.setZoomButtonsVisible(true);//设置伸缩按钮是否可见// mRenderer.setZoomEnabled(true);// mRenderer.setExternalZoomEnabled(true);//设置是否可以向伸缩// mRenderer.setXLabels(0);Random r = new Random();int[] colors = { Color.BLUE, Color.RED, Color.GREEN, Color.YELLOW,Color.LTGRAY };for (int i = 0; i < 5; i++) {// 线的条数,也就是对象的意思,显示在图表下,用于提示信息,比如Cpu有5个//XYSeries series = new XYSeries("cpu" + i);XYValueSeries series = new XYValueSeries("cpu" + i);for (int k = 0; k < 10; k++) {series.add(k, r.nextInt(50));}mDataset.addSeries(series);// 点的绘制进行设置XYSeriesRenderer xyRenderer = new XYSeriesRenderer();// 设置颜色xyRenderer.setColor(colors[i]);// 设置点的样式xyRenderer.setPointStyle(PointStyle.SQUARE);// 线条宽度xyRenderer.setLineWidth(3);// 是否显示值xyRenderer.setDisplayChartValues(true);// 如果显示值,字体大小xyRenderer.setChartValuesTextSize(10);// 点的形状,是空心的还是实心的xyRenderer.setFillPoints(false);// 刻度之间的距离xyRenderer.setDisplayChartValuesDistance(5);// 点与数值的距离xyRenderer.setChartValuesSpacing(10);//xyRenderer.setDisplayBoundingPoints(false);// 点的面积xyRenderer.setPointStrokeWidth(1);// 是否显示图例xyRenderer.setShowLegendItem(true);mRenderer.addSeriesRenderer(xyRenderer);}// 线性图// Intent intent = ChartFactory.getLineChartIntent(this, mDataset,// mDataset);// 柱状图//Intent intent = ChartFactory.getBarChartIntent(this, mDataset,//mRenderer, Type.DEFAULT);// 带标题的柱状图// Intent intent = ChartFactory.getBarChartIntent(this, mDataset,// mRenderer, Type.DEFAULT, "cpu效率"); Intent intent = ChartFactory.getBubbleChartIntent(this, mDataset, mRenderer);startActivity(intent);}}

图:




很显然这还不是气泡图,只是分列图。


想要气泡,肯定有一个参数来设置气泡的半径,加上第三个参数.


series.add(k + 1f, r.nextInt(50),i);

然后我们就能看到气泡了:




学习过程中遇到的错误归纳

错误1.


08-11 10:19:29.720: E/AndroidRuntime(18551): FATAL EXCEPTION: main08-11 10:19:29.720: E/AndroidRuntime(18551): Process: com.sprd.chartexample, PID: 1855108-11 10:19:29.720: E/AndroidRuntime(18551): java.lang.ClassCastException: org.achartengine.model.XYSeries cannot be cast to org.achartengine.model.XYValueSeries08-11 10:19:29.720: E/AndroidRuntime(18551): at org.achartengine.chart.BubbleChart.drawSeries(BubbleChart.java:75)08-11 10:19:29.720: E/AndroidRuntime(18551): at org.achartengine.chart.XYChart.drawSeries(XYChart.java:518)08-11 10:19:29.720: E/AndroidRuntime(18551): at org.achartengine.chart.XYChart.draw(XYChart.java:311)08-11 10:19:29.720: E/AndroidRuntime(18551): at org.achartengine.GraphicalView.onDraw(GraphicalView.java:168)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.draw(View.java:14480)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.getDisplayList(View.java:13370)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.getDisplayList(View.java:13412)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.draw(View.java:14197)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.ViewGroup.drawChild(ViewGroup.java:3103)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.getDisplayList(View.java:13365)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.getDisplayList(View.java:13412)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.draw(View.java:14197)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.ViewGroup.drawChild(ViewGroup.java:3103)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.draw(View.java:14483)08-11 10:19:29.720: E/AndroidRuntime(18551): at com.android.internal.widget.ActionBarOverlayLayout.draw(ActionBarOverlayLayout.java:388)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.getDisplayList(View.java:13370)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.getDisplayList(View.java:13412)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.draw(View.java:14197)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.ViewGroup.drawChild(ViewGroup.java:3103)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.draw(View.java:14483)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.widget.FrameLayout.draw(FrameLayout.java:472)08-11 10:19:29.720: E/AndroidRuntime(18551): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2366)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.getDisplayList(View.java:13370)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.View.getDisplayList(View.java:13412)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1570)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1449)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2396)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2268)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1892)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5739)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.Choreographer.doCallbacks(Choreographer.java:574)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.Choreographer.doFrame(Choreographer.java:544)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.os.Handler.handleCallback(Handler.java:733)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.os.Handler.dispatchMessage(Handler.java:95)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.os.Looper.loop(Looper.java:136)08-11 10:19:29.720: E/AndroidRuntime(18551): at android.app.ActivityThread.main(ActivityThread.java:5372)08-11 10:19:29.720: E/AndroidRuntime(18551): at java.lang.reflect.Method.invokeNative(Native Method)08-11 10:19:29.720: E/AndroidRuntime(18551): at java.lang.reflect.Method.invoke(Method.java:515)08-11 10:19:29.720: E/AndroidRuntime(18551): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:970)08-11 10:19:29.720: E/AndroidRuntime(18551): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:786)08-11 10:19:29.720: E/AndroidRuntime(18551): at dalvik.system.NativeStart.main(Native Method)

因为代码:


<pre name="code" class="java">XYSeries series = new XYSeries("cpu" + i);


此时应该将XYSeries改成XYValueSeries类。


错误2.


09-10 23:23:31.360: E/AndroidRuntime(1369): FATAL EXCEPTION: main09-10 23:23:31.360: E/AndroidRuntime(1369): Process: com.sprd.chartexample, PID: 136909-10 23:23:31.360: E/AndroidRuntime(1369): java.lang.ArrayIndexOutOfBoundsException: length=0; index=-109-10 23:23:31.360: E/AndroidRuntime(1369): at java.util.ArrayList.get(ArrayList.java:310)09-10 23:23:31.360: E/AndroidRuntime(1369): at org.achartengine.model.XYValueSeries.getValue(XYValueSeries.java:118)09-10 23:23:31.360: E/AndroidRuntime(1369): at org.achartengine.chart.BubbleChart.drawSeries(BubbleChart.java:79)09-10 23:23:31.360: E/AndroidRuntime(1369): at org.achartengine.chart.XYChart.drawSeries(XYChart.java:518)09-10 23:23:31.360: E/AndroidRuntime(1369): at org.achartengine.chart.XYChart.draw(XYChart.java:311)09-10 23:23:31.360: E/AndroidRuntime(1369): at org.achartengine.GraphicalView.onDraw(GraphicalView.java:168)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.View.draw(View.java:14433)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.View.draw(View.java:14318)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.ViewGroup.drawChild(ViewGroup.java:3103)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.View.draw(View.java:14316)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.ViewGroup.drawChild(ViewGroup.java:3103)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.View.draw(View.java:14436)09-10 23:23:31.360: E/AndroidRuntime(1369): at com.android.internal.widget.ActionBarOverlayLayout.draw(ActionBarOverlayLayout.java:381)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.View.draw(View.java:14318)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.ViewGroup.drawChild(ViewGroup.java:3103)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.View.draw(View.java:14436)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.widget.FrameLayout.draw(FrameLayout.java:472)09-10 23:23:31.360: E/AndroidRuntime(1369): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2324)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2494)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2407)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2251)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1881)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5582)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.Choreographer.doCallbacks(Choreographer.java:562)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.Choreographer.doFrame(Choreographer.java:532)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.os.Handler.handleCallback(Handler.java:733)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.os.Handler.dispatchMessage(Handler.java:95)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.os.Looper.loop(Looper.java:137)09-10 23:23:31.360: E/AndroidRuntime(1369): at android.app.ActivityThread.main(ActivityThread.java:4998)09-10 23:23:31.360: E/AndroidRuntime(1369): at java.lang.reflect.Method.invokeNative(Native Method)09-10 23:23:31.360: E/AndroidRuntime(1369): at java.lang.reflect.Method.invoke(Method.java:515)09-10 23:23:31.360: E/AndroidRuntime(1369): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)09-10 23:23:31.360: E/AndroidRuntime(1369): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)09-10 23:23:31.360: E/AndroidRuntime(1369): at dalvik.system.NativeStart.main(Native Method)

这是由于代码


series.add(k , r.nextInt(50),i);

第一个参数没有将int转变为float型的,默认调用add(int index,double x, double y),而我们想要调用的是add(double x,double y,double value)。

所以将代码变为


series.add(k + 1f, r.nextInt(50),i);

即可



0 0