View和SurfaceView都可以用于绘制图形,但各有各的适用场合。一般情况,主动更新,不考虑UI线程的限制,双缓存加速等情况下会优先考虑SurfaceView。
下面把上篇中的MyView通过继承SurfaceView来重新编写,具体如下:
public class MyView extends SurfaceView implements Callback, Runnable { private Paint mPaint; private SurfaceHolder mSurfaceHolder; private Thread mThread; private void initial() { mPaint = new Paint(); mPaint.setAntiAlias(true); this.setKeepScreenOn(true); mPaint.setColor(Color.RED); mThread = new Thread(this); mSurfaceHolder = getHolder(); mSurfaceHolder.addCallback(this); } public MyView(Context context) { super(context); initial(); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); initial(); } private void draw() { Canvas mCanvas = null; try { mCanvas = mSurfaceHolder.lockCanvas(); mCanvas.drawColor(Color.WHITE); mCanvas.drawText("绘制文字", 10, 20, mPaint); mCanvas.drawCircle(35, 50, 20, mPaint); } catch (Exception e) { e.printStackTrace(); } finally { if (mCanvas != null) { mSurfaceHolder.unlockCanvasAndPost(mCanvas); } } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceCreated(SurfaceHolder holder) { mThread.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override public void run() { draw(); } }
说明:
- 获取SurfaceHolder:mSurfaceHolder = getHolder();
- 为SurfaceHolder添加CallBack:mSurfaceHolder.addCallback(this);
- 创建绘制线程:mThread = new Thread(this);
- 绘制函数:draw();自定义的函数名称,如果你喜欢,你可以在遵守规则的前提下随意命名;
- 当SurfaceView被创建时,启动绘制线程:mThread.start();
- 从SurfaceHolder获得Canvas对象:mCanvas = mSurfaceHolder.lockCanvas();
调用方式和以前一样,这也仅仅是一个View,只不过是继承SurfaceView而已!
效果如图:
希望对你有所帮助!:)