数独游戏首先需要一个表格,这里需要自定义一个类继承自View,例如ShuduView,然后在MainActivity中setContentView(new ShuduView(this))
。
接着就需要完成ShuduView里面的操作了。首先要获取每个单元格的长和宽,这里需要重写onSizeChanged方法:
//当屏幕尺寸发生变化的时候(横竖屏切换),会被调用
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
width=w/9f;//单元格的宽
height=h/9f;//单元格的高
}
接着需要实现几个画笔(Paint)对象,这时候需要重写onDraw方法,这个方法是真正对视图进行绘制的方法:
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//对几个画笔进行设置
darkPaint.setColor(getResources().getColor(R.color.shudu_dark));
lightPaint.setColor(getResources().getColor(R.color.shudu_light));
hilitePaint.setColor(getResources().getColor(R.color.shudu_hilite));
backgroundPaint.setColor(getResources().getColor(R.color.shudu_background));
这里面的canvas是画布的意思,用途应该不言而喻了吧
//region 画出表格
for(int i=0;i<9;i++){
//这两个相差1像素的线只是为了好看罢了
canvas.drawLine(i*width,0,i*width,getHeight(),lightPaint);
canvas.drawLine(i*width+1,0,i*width+1,getHeight(),hilitePaint);
canvas.drawLine(0,i*height,getWidth(),i*height,lightPaint);
canvas.drawLine(0,i*height+1,getWidth(),i*height+1,lightPaint);
//这里是实现每九个单元格又组成一个大的单元格的线
if(i%3==0){
canvas.drawLine(i*width,0,i*width,getHeight(),darkPaint);
canvas.drawLine(i*width+1,0,i*width+1,getHeight(),hilitePaint);
canvas.drawLine(0,i*height,getWidth(),i*height,darkPaint);
canvas.drawLine(0,i*height+1,getWidth(),i*height+1,lightPaint);
}
}
//endregion
最终效果图:
自我总结:在重做这个部分的时候,忘了怎么获取单元格的长和宽了。另外在绘制线的时候,在stopX(或Y)的部分写成9*width(或height),没有想到getWidth(或height)方法