原理(来自Android的SDk文档):
访问SurfaceView的底层图形是通过SurfaceHolder接口来实现的,通过getHolder()方法可以得到这个 SurfaceHolder对象。你应该实现surfaceCreated(SurfaceHolder)和surfaceDestroyed(SurfaceHolder)方法来知道在这个Surface在窗口的显示和隐藏过程中是什么时候创建和销毁的。
SurfaceView可以在多线程中被访问。
注意:一个SurfaceView只在SurfaceHolder.Callback.surfaceCreated() 和 SurfaceHolder.Callback.surfaceDestroyed()调用之间是可用的,其他时间是得不到它的Canvas对象的(null)。
我的访问过程:
创建一个SurfaceView的子类,实现SurfaceHolder.Callback接口。
得到这个SurfaceView的SurfaceHolder对象holder。
holder.addCallback(callback),也就是实现SurfaceHolder.Callback接口的类对象。
在SurfaceHolder.Callback.surfaceCreated()调用过后holder.lockCanvas()对象就可以得到SurfaceView对象对应的Canvas对象canvas了。
用canvas对象画图。
画图结束后调用holder.unlockCanvasAndPost()就把图画在窗口中了。
SurfaceView可以多线程访问,在多线程中画图。
import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { private Context mContext; private SurfaceHolder mHolder; public TouchScreenAdjusterSurfaceView(Context context,) { super(context); mContext = context; mHolder = TouchScreenAdjusterSurfaceView.this.getHolder(); mHolder.addCallback(TouchScreenAdjusterSurfaceView.this); this.setFocusableInTouchMode(true); // to make sure that we can get // touch events and key events,and // "setFocusable()" to make sure we // can get key events } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { //now you can get the Canvas and draw something here } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } public void drawMyShape(PointPostion ps) { mCanvas = mHolder.lockCanvas(); // draw anything you like mHolder.unlockCanvasAndPost(mCanvas); } }
给公司写的代码片段,仅供示意,见谅。