package com.example.line;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PaintFlagsDrawFilter;import android.util.AttributeSet;import android.view.View;public class LineView extends View { private final static String X_KEY = "Xpos"; private final static String Y_KEY = "Ypos"; private List
> mListPoint = new ArrayList
>(); Paint mPaint = new Paint(); public LineView(Context context, AttributeSet attrs, int defStyle) {  super(context, attrs, defStyle); } public LineView(Context context, AttributeSet attrs) {  super(context, attrs); } public LineView(Context context) {  super(context); } @SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) {  super.onDraw(canvas);  mPaint.setColor(Color.RED);  mPaint.setAntiAlias(true);  for (int index = 0; index < mListPoint.size(); index++) {   if (index > 0) {    canvas.drawLine(mListPoint.get(index - 1).get(X_KEY),      mListPoint.get(index - 1).get(Y_KEY),      mListPoint.get(index).get(X_KEY), mListPoint.get(index)        .get(Y_KEY), mPaint);    canvas.setDrawFilter(new PaintFlagsDrawFilter(0,      Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));   }  } } /**  * 设置数据  * @param curX  * @param curY  */ public void setLinePoint(int curX, int curY) {  Map
 temp = new HashMap
();  temp.put(X_KEY, curX);  temp.put(Y_KEY, curY);  mListPoint.add(temp);  invalidate(); }}UI类:package com.example.line;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.annotation.SuppressLint;import android.app.Activity;@SuppressLint("HandlerLeak")public class MainActivity extends Activity { private static final int MSG_DATA_CHANGE = 0x11; private LineView mLineView; private Handler mHandler; private int mX = 0; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  init();  mHandler = new Handler() {   @Override   public void handleMessage(Message msg) {    switch (msg.what) {    case MSG_DATA_CHANGE:     mLineView.setLinePoint(msg.arg1, msg.arg2);     break;    }    super.handleMessage(msg);   }  };  new Thread() {   @Override   public void run() {    for (int index = 0; index < 100; index++) {     Message message = new Message();     message.what = MSG_DATA_CHANGE;     message.arg1 = mX;     message.arg2 = (int) (Math.random() * 200);     mHandler.sendMessage(message);     try {      sleep(1000);     } catch (InterruptedException e) {      // TODO Auto-generated catch block      e.printStackTrace();     }     mX += 10;    }   }  }.start(); } private void init() {  mLineView = (LineView) findViewById(R.id.line); }}布局