> 首先创建一个自己的View类
-->继承SurfaceView并实现SurfaceHolder.Callback接口
--> SurfaceView.getHolder()获得SurfaceHolder对象
-->SurfaceHolder.addCallback(callback) 添加回调函数
-->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布
--> Canvas绘画
-->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定,并提交改变,将图形显示。
public class GameSFView extends SurfaceView implements Callback{
private SurfaceHolder surfaceHolder;
private int selectedX = 0;
private int selectedY = 0;
/**
* 单元格的宽度
*/
private float width;
/**
*单元格的高度
*/
private float height;
/**
*main.xml 中引用此surfaceview类 构造方法必须使用两个形参的形式
*/
public GameSFView(Context context, AttributeSet attrs) {
super(context, attrs);
surfaceHolder = this.getHolder(); // 获取SurfaceHolder对象
//监听Surface的生命周期 给SurfaceView当前的持有者一个回调对象。
surfaceHolder.addCallback(this); // 添加回调
}
}
实现三个回调函数
//在surface的大小发生改变时激发
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
//在创建时激发,一般在这里调用画图的线程。
//最好在Surface被创建的时候,开启绘图线程。
//子线程绘图 缓存到surface中
@Override
public void surfaceCreated(SurfaceHolder holder) {
draw();
}
//销毁时激发,一般在这里将画图的线程停止、释放。
//最好在Surface被销毁的时候,销毁绘图线程
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
自定义绘制方法
/**
* 自定义绘制方法
*/
public void draw() {
synchronized(surfaceHolder){
// 获取Canvas对象
// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
Canvas canvas = null;
Paint paint = new Paint();
try{
canvas = surfaceHolder.lockCanvas(); // 锁住Canvas
// 清理屏幕 绘制背景
initGameView(canvas, paint);
//重绘surfaceview 填充新增的数据
inflateNewNum(canvas,paint);
}catch(Exception e){
e.printStackTrace();
}finally{
if(canvas != null)
// 结束锁定画图,并提交改变。
surfaceHolder.unlockCanvasAndPost(canvas); // 解锁Canvas,更新
}
}
}
这里最好使用同步锁,并且在使用try catch finally 进行异常捕获。
private void initGameView(Canvas canvas,Paint paint){
//bgBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.background);
//初始化游戏背景
initGameBg(canvas,paint);
//初始化游戏线条
initGameLine(canvas,paint);
//初始化游戏数据
initFirstNumber(canvas,paint);
}
绘制棋盘上的线条
private void initGameLine(Canvas canvas,Paint paint) {
//设置画笔颜色
paint.setColor(Color.BLACK);
//画横线
for(int i=1;i<10;i++){
canvas.drawLine(0 ,i*height, getWidth(), i*height, paint);
}
//画竖线
for(int i=1;i<9;i++){
canvas.drawLine(i*height,0, i*height,getWidth(), paint);
}
//画三道横粗线
paint.setStrokeWidth(4);
for(int i=1;i<4;i++){
canvas.drawLine(0 ,i*height*3, getWidth(), i*height*3, paint);
}
//画三道竖粗线
for(int i=1;i<9;i++){
canvas.drawLine(i*height*3,0, i*height*3,getWidth(), paint);
}
}
结伴旅游,一个免费的交友网站:www.jieberu.com
推推族,免费得门票,游景区:www.tuituizu.com