在自定义的SurfaceView中绘制内容
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);}}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceCreated(SurfaceHolder holder) {mThread.start();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}@Overridepublic 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而已!
效果如图:
希望对你有所帮助!:)
?