packagecom.example.line;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importandroid.annotation.SuppressLint;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.graphics.PaintFlagsDrawFilter;importandroid.util.AttributeSet;importandroid.view.View;publicclassLineViewextendsView{privatefinalstaticStringX_KEY="Xpos";privatefinalstaticStringY_KEY="Ypos";privateList<Map<String,Integer>>mListPoint=newArrayList<Map<String,Integer>>();PaintmPaint=newPaint();publicLineView(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);}publicLineView(Contextcontext,AttributeSetattrs){super(context,attrs);}publicLineView(Contextcontext){super(context);}@SuppressLint("DrawAllocation")@OverrideprotectedvoidonDraw(Canvascanvas){super.onDraw(canvas);mPaint.setColor(Color.RED);mPaint.setAntiAlias(true);for(intindex=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(newPaintFlagsDrawFilter(0,Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));}}}/***设置数据*@paramcurX*@paramcurY*/publicvoidsetLinePoint(intcurX,intcurY){Map<String,Integer>temp=newHashMap<String,Integer>();temp.put(X_KEY,curX);temp.put(Y_KEY,curY);mListPoint.add(temp);invalidate();}}UI类:packagecom.example.line;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.annotation.SuppressLint;importandroid.app.Activity;@SuppressLint("HandlerLeak")publicclassMainActivityextendsActivity{privatestaticfinalintMSG_DATA_CHANGE=0x11;privateLineViewmLineView;privateHandlermHandler;privateintmX=0;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();mHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){switch(msg.what){caseMSG_DATA_CHANGE:mLineView.setLinePoint(msg.arg1,msg.arg2);break;}super.handleMessage(msg);}};newThread(){@Overridepublicvoidrun(){for(intindex=0;index<100;index++){Messagemessage=newMessage();message.what=MSG_DATA_CHANGE;message.arg1=mX;message.arg2=(int)(Math.random()*200);mHandler.sendMessage(message);try{sleep(1000);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}mX+=10;}}}.start();}privatevoidinit(){mLineView=(LineView)findViewById(R.id.line);}}布局<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity"><com.example.line.LineViewandroid:id="@+id/line"android:layout_centerInParent="true"android:layout_width="400dp"android:layout_height="400dp"android:background="#ffffff"/></RelativeLayout>