android 小游戏 ---- 数独(二)
2024-08-30 21:35:25
> 首先创建一个自己的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
最新文章
- (翻译)FIFO In Hardware
- QT 信号与槽connect
- JS Array ECMAScript5 Methods
- How To Use API Online?
- android widget 点击进入应用
- 第九篇:web之前端之web上传文件的方式
- java模拟一个抽奖程序
- TI Davinci DM6446开发攻略——根文件系统的裁剪和移植
- sqlparameters
- jupyter notebook的安装与基本操作
- 脚本一键部署lnmp
- [java,2018-02-01] quartz定时任务中时间表达式
- mysql学习(2)-Navicat Premium 12 链接MySQL8.0.11数据库报2059错误
- Hadoop系列之(三):使用Cloudera部署,管理Hadoop集群
- Linux学习1-Xshell连接阿里云ECS服务器
- cocos2d-js 3.0 rc0 编译release报错 value for keystore is not valid. it must resolve to a single path
- eclipse项目setting文件
- HTML5 drag &; drop 拖拽与拖放
- Cmder命令行工具在Windows系统中的配置
- [TJOI2013]单词 AC自动机