最近因项目的需求需要在某个界面上绘制动态增长的曲线图,网上找了些相关的资料,经过改编简单的实现了该效果,上传代码如下:
public class CornerPathTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout layout=(LinearLayout)findViewById(R.id.linear);
layout.addView(new Myview(getApplicationContext()));
}
class Myview extends View {
/* 线程控制 */
private boolean display = true;
/* 开始绘制的时候下一个点的x,y */
private float Yheight = 0;
private float Xwhite = 0;
/* 接收要绘制的所有点 */
private ArrayList<Point> list;
private HashMap<String, List<Point>> map;
/* 是否开启动画模式 */
private boolean animMode = true;
/* 传过来点 的数量 */
private int listlength;
/* 开始绘图点 */
private int startpoint = 1;
PathEffect effects = new CornerPathEffect(10);
int colors = Color.BLUE;
private Paint paint;
Path path;
/*标签文字集合*/
private String[] series;
public Myview(Context context) {
super(context);
init();
}
@Override
protected void onDraw(Canvas canvas) {
// 将背景填充成白色
canvas.drawColor(Color.WHITE);
// 将画布移到8,8处开始绘制
canvas.translate(8, 8);
paint.setPathEffect(effects);
paint.setColor(colors);
path.lineTo(Xwhite, Yheight);
canvas.drawPath(path, paint);
canvas.translate(0, 60);
Paint p=new Paint();
p.setStyle(Style.STROKE);
p.setColor(Color.BLACK);
p.setStrokeWidth(2);
for (int i = 0; i < series.length; i++) {
canvas.drawText(series[i], i*40, 70, p);
}
invalidate();
}
private Thread thread = new Thread() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted() && display) {
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
try {
// 每隔1秒触发,使得画线的过程看起来平滑
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("InterruptedException !线程关闭");
this.interrupt();
}
}
}
};
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
super.handleMessage(msg);
if (msg.what == 1 && startpoint < listlength && display) {
Yheight = list.get(startpoint).y;
Xwhite = list.get(startpoint).x;
startpoint++;
} else {
display = false;
}
/* 刷新UI */
invalidate();
};
};
private void init() {
paint = new Paint();
paint.setStyle(Style.STROKE);
paint.setStrokeWidth(4);
// 创建,并初始化Path
path = new Path();
path.moveTo(0, 0);
list = new ArrayList<Point>();
map = new HashMap<String, List<Point>>();
for (int i = 1; i <= 10; i++) {
// 生成15个点,随机生成他们的坐标,并将它们连成一条Path
Point point = new Point();
point.x = i * 20;
point.y = (float) Math.random() * 60;
list.add(point);
if (i%2==0) {
map.put(i * 20 + "m", list);
}
}
listlength = list.size();
series = map.keySet().toArray(new String[0]);
if (animMode) {
thread.start();
}
}
}
}