android实现折线图功能,android绘制折线图绘制
折线图的实现⽅法在github上有很多开源的程序,但是对于初学者来讲,简单⼀点的教程可能更容易⼊门,下⾯的⽂章来⾃csdn的阳光的⼩强,或许有⽤(没仔细阅读,⼤概看了下⽂章的结构清晰,折线图的效果也还好)。
有时候我们在项⽬中会遇到使⽤折线图等图形,Android的开源项⽬中为我们提供了很多插件,但是很多时候我们需要根据具体项⽬⾃定义这些图表,这⼀篇⽂章我们⼀起来看看如何在Android中使⽤Canvas绘制折线图。先看看绘制的效果:
实现原理很简单,我就直接给出代码:stcanvasdraw;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
android简单教程t.Context;
aphics.Canvas;
aphics.Color;
aphics.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 List data = new ArrayList();
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; 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.add(new Random().nextInt(4) + 1);
handler.sendEmptyMessage(0x1234);
}
}
}).start();
}
@Override
protected void onDraw(Canvas 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
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; i
canvas.drawLine(XPoint + (i-1) * XScale, YPoint - (i-1) * YScale,
XPoint + i * XScale, YPoint - (i) * YScale, paint);
}
}
}
}
上⾯绘制折线部分我们还有⼀种⽅式同样可以实现:if(data.size() > 1){
Path path = new Path();
for(int i=1; i
path.lineTo(XPoint + i * XScale, YPoint - (i) * YScale);
}
canvas.drawPath(path, paint);
}
下⾯我们将上⾯代码修改,让折线下⾯的区域颜⾊填充
stcanvasdraw; import java.util.ArrayList;
import java.util.List;
import java.util.Random;
t.Context;
aphics.Canvas;
aphics.Color;
aphics.Paint;
aphics.Path;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
/**
*
* @author 阳光⼩强
*
*/
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 List data = new ArrayList();
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; 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.add(new Random().nextInt(4) + 1);
handler.sendEmptyMessage(0x1234);
}
}
}).start();
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();