`
wangleyiang
  • 浏览: 214875 次
社区版块
存档分类
最新评论

在自定义的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);
			}
		}
		
	}

	@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();
	}

}

 说明:

 

  1. 获取SurfaceHolder:mSurfaceHolder = getHolder();
  2. 为SurfaceHolder添加CallBack:mSurfaceHolder.addCallback(this);
  3. 创建绘制线程:mThread = new Thread(this);
  4. 绘制函数:draw();自定义的函数名称,如果你喜欢,你可以在遵守规则的前提下随意命名;
  5. 当SurfaceView被创建时,启动绘制线程:mThread.start();
  6. 从SurfaceHolder获得Canvas对象:mCanvas = mSurfaceHolder.lockCanvas();

调用方式和以前一样,这也仅仅是一个View,只不过是继承SurfaceView而已!

效果如图:



希望对你有所帮助!:)

 

  • 大小: 2.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics