在org.achartengine.renderer这个包里有一个类BasicStroke,可以改变线型(实线、虚线、点线),而折线图中用的是XYMultipleSeriesRenderer这个类,它继承自DefaultRenderer,这个与BasicStroke是一个包里的子类,DefaultRenderer有一个方法是setShowGridY(boolean showGrid),感觉在这个方法里肯定有设置线型的语句,但是我现在没找到AChartEngine的具体五毛源码,不知道这个方法具体是怎样的,只能提供给你一个思路……我几个月前也捣鼓过AChartEngine
创新互联自2013年创立以来,是专业互联网技术服务公司,拥有项目网站设计、网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元高安做网站,已为上家服务,为高安各地企业和个人服务,联系电话:18982081108
这个可以用安卓自定义view里的ondraw()方法来实现,通过获取的坐标,画图连接起来即可
下面的例子是一个画矩形 的代码,你可以试着改成画曲线
public class AndroidTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyView mv = new MyView(this);
setContentView(mv);
}
public class MyView extends View {
MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
// 首先定义一个paint
Paint paint = new Paint();
// 绘制矩形区域-实心矩形
// 设置颜色
paint.setColor(Color.BLUE);
// 设置样式-填充
paint.setStyle(Style.FILL);
// 绘制一个矩形
canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);
// 绘空心矩形
// 设置颜色
paint.setColor(Color.RED);
// 设置样式-空心矩形
paint.setStyle(Style.STROKE);
// 绘制一个矩形
canvas.drawRect(new Rect(10, 10, 100, 30), paint);
// 绘文字
// 设置颜色
paint.setColor(Color.GREEN);
// 绘文字
canvas.drawText("Hello", 10, 50, paint);
// 绘图
// 从资源文件中生成位图
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
// 绘图
canvas.drawBitmap(bitmap, 10, 60, paint);
}
}
}
用Canvas的drawLine方法就可以了canvas.drawLine(startX, startY, stopX, stopY, paint);
startX, startY为起始坐标;
stopX, stopY为终点坐标;
paint就是一个Paint对象;
比如你的横坐标的第一个坐标是(1, 2), 第二个坐标是(2, 5), 第三个坐标是(3, 10),那么这段折线可以这样画:
canvas.drawLine(1,2,2,5,paint);
canvas.drawLine(2,5,3,10,paint);
以此类推,剩下的3段折线都可以这样画出来
推荐你几个相关开源项目,可以根据需要自己选择,自己画还是比较麻烦的:MPAndroidChart强大的图表绘制工具,支持折线图、面积图、散点图、时间图、柱状图、条图、饼图、气泡图、圆环图、范围(高至低)条形图、网状图及各种图的结合;支持图的拖拽缩放;支持Android2.2以上,支持横纵轴缩放,多指缩放,展现动画、高亮、保存到sdcard、从文件读取图表achartengine强大的图表绘制工具,支持折线图、面积图、散点图、时间图、柱状图、条图、饼图、气泡图、圆环图、范围(高至低)条形图、拨号图/表、立方线图及各种图的结合GraphView绘制图表和曲线图的View,可用于Android上的曲形图、柱状图、波浪图展示HoloGraphLibrary绘制线状图、柱状图、饼状图XCL-ChartsXCL-Charts基于原生的Canvas来绘制各种图表,在设计时,尽量在保证开发效率的同时,给使用者提供足够多的定制化能力。因此使用简便,同时具有相当灵活的定制能力。目前支持3D/非3D柱形图(BarChart)、3D/非3D饼图(PieChart)、堆积图(StackedBarChart)、面积图(AreaChart)、折线图(LineChart)、曲线图(SplineChart)、环形图(DountChart)、南丁格尔玫瑰图(RoseChart)、仪表盘(DialChart)、刻度盘(GaugeChart)、雷达图(RadarChart)、圆形图(CircleChart)等图表。其它特性还包括支持图表缩放、手势移动、动画显示效果、高密度柱形显示、图表分界定制线、多图表的混合显示及同数据源不同类型图表切换等。EazeGraphAndroid图表库,支持柱状图、分层柱状图、饼状图、线性图WilliamChart绘制图表的库,支持LineChartView、BarChartView和StackBarChartView三中图表类型,并且支持Android2.2及以上的系统。HelloChartsforAndroid支持折线图、柱状图、饼图、气泡图、组合图;支持预览、放大缩小,滚动,部分图表支持动画;支持Android2.2以上这些项目都可以在GitHub搜索到。
package com.example.testcanvasdraw; import java.util.ArrayList; import java.util.List; import java.util.Random; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.View; public class MyView extends View{ private int XPoint = 60; private int YPoint = 260; private int XScale = 8; //刻度长度 private int YScale = 40; private int XLength = 380; private int YLength = 240; private int MaxDataSize = XLength / XScale; private ListInteger data = new ArrayListInteger(); private String[] YLabel = new String[YLength / YScale]; private Handler handler = new Handler(){ public void handleMessage(Message msg) { if(msg.what == 0x1234){ MyView.this.invalidate(); } }; }; public MyView(Context context, AttributeSet attrs) { super(context, attrs); for(int i=0; iYLabel.length; i++){ YLabel[i] = (i + 1) + "M/s"; } new Thread(new Runnable() { @Override public void run() { while(true){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if(data.size() = MaxDataSize){ data.remove(0); } data.add(new Random().nextInt(4) + 1); handler.sendEmptyMessage(0x1234); } } }).start(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setAntiAlias(true); //去锯齿 paint.setColor(Color.BLUE); //画Y轴 canvas.drawLine(XPoint, YPoint - YLength, XPoint, YPoint, paint); //Y轴箭头 canvas.drawLine(XPoint, YPoint - YLength, XPoint - 3, YPoint-YLength + 6, paint); //箭头 canvas.drawLine(XPoint, YPoint - YLength, XPoint + 3, YPoint-YLength + 6 ,paint); //添加刻度和文字 for(int i=0; i * YScale YLength; i++) { canvas.drawLine(XPoint, YPoint - i * YScale, XPoint + 5, YPoint - i * YScale, paint); //刻度 canvas.drawText(YLabel[i], XPoint - 50, YPoint - i * YScale, paint);//文字 } //画X轴 canvas.drawLine(XPoint, YPoint, XPoint + XLength, YPoint, paint); System.out.println("Data.size = " + data.size()); if(data.size() 1){ for(int i=1; idata.size(); i++){ canvas.drawLine(XPoint + (i-1) * XScale, YPoint - data.get(i-1) * YScale, XPoint + i * XScale, YPoint - data.get(i) * YScale, paint); } } } }
上面绘制折线部分我们还有一种方式同样可以实现:
if(data.size() 1){ Path path = new Path(); path.moveTo(XPoint, YPoint - data.get(0) * YScale); for(int i=1; idata.size(); i++){ path.lineTo(XPoint + i * XScale, YPoint - data.get(i) * YScale); } canvas.drawPath(path, paint); }
直接在旁边写数字就可以了。主要画折线图。
步骤一:折线图的坐标集
首先应该创建 XYSeries对象 : 用于提供绘制的点集合的数据
XYSeries series = new XYSeries(titles[i]); // 根据每条线的名称创建
将所有的坐标加入这个集合
series .add (xV[k], yV[k]);
XYMultipleSeriesDataset对象 用于 保存点集数据 ,包括每条曲线的X,Y坐标
// 用于数据的存放
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
dataset .addSeries (series);
步骤二:折线图的样式集
定义每条曲线的颜色
int [] colors = new int [] {Color. BLUE ,Color. GREEN };
定义每条曲线的点的形状
PointStyle [] styles =
new PointStyle []{ PointStyle . CIRCLE , PointStyle . DIAMOND };
曲线图的格式,包括颜色,值的范围,点和线的形状等等 都封装在 XYSeriesRender对象中,再将XYSeriesRender对象封装在 XYMultipleSeriesRenderer 对象中
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(colors[i]);
r.setPointStyle(styles[i]);
r.setFillPoints(fill);
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
renderer.addSeriesRenderer(r);
设置折线图名称,坐标轴的名称,坐标轴的起点重点,坐标轴的颜色,坐标轴上数字的颜色
setChartSettings(renderer, "Line Chart Demo" , "X" , "Y" , - 1 , 12, 0, 35 , Color. WHITE , Color. WHITE );
步骤三:显示折线图
View chart = ChartFactory. getLineChartView ( this , dataset, renderer);
setContentView(chart);