在View上面绘图
view提供了onDraw()被framework在需要重画的时候调用,我们可以重写onDraw()方法在提供的canvas上面绘制
<span style="font-size:10px;"> @Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawText("hello my view", 100, 100, paint);
}</span>
在SurfaceView上面绘图
SurfaceView是View的子类,提供了更丰富的绘制机制,它提供的surface可以支持非主线程绘制。
- 继承SurfaceView
- 通过调用getHolder()取得SurfaceHolder实例
- addCallback()
- 实现SurfaceHolder.Callback,在surfaceCreated(),surfaceChanged(),surfaceDestroyed()中启动新线程绘制
自定义的SurfaceView
/**
*
*/
package com.example.drawview;
import android.content.Context;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* @author wangjerowarm
*/
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder;
/**
* @param context
*/
public MySurfaceView(Context context) {
super(context);
holder = getHolder();
holder.addCallback(this);
// TODO Auto-generated constructor stub
}
/*
* (non-Javadoc)
* @see
* android.view.SurfaceHolder.Callback#surfaceCreated(android.view.SurfaceHolder
* )
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
new DrawThread(holder).start();
}
/*
* (non-Javadoc)
* @see
* android.view.SurfaceHolder.Callback#surfaceChanged(android.view.SurfaceHolder
* , int, int, int)
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
* @see android.view.SurfaceHolder.Callback#surfaceDestroyed(android.view.
* SurfaceHolder)
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}
绘图线程
public class DrawThread extends Thread {
private SurfaceHolder surfaceHolder;
private Canvas canvas;
public DrawThread(SurfaceHolder holder) {
surfaceHolder = holder;
}
/*
* (non-Javadoc)
* @see java.lang.Thread#run()
*/
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
canvas = surfaceHolder.lockCanvas();//因为是异步绘制,需要先调用lockCanvas()
Paint paint = new Paint();
paint.setColor(Color.GREEN);
canvas.drawText("hello surfaceView", 200, 200, paint);
surfaceHolder.unlockCanvasAndPost(canvas);//绘制完成后unlockCanvas,并且把绘制完成的message post给主线程,主线程完成剩余工作
}
}