简单实现Android数独游戏
本文实例为大家分享了Android数独游戏的具体代码,供大家参考,具体内容如下
实现了点击了相关的单元格之后会显示出对话框提示可选数字。
原始的自定义对话框仍旧不能满足我们的要求,原始的自定义对话框只能够生成Bulider对象 然后通过LayoutInflater获取相应的View对象
(其实就是Layout布局文件)
其实也是可以的,只是我们不能再次进行一些其他的操作了,比如说我们即使设置了TableLayout但是我们不能够在上面完成任何操作,因为并不允许使用
自定义方法设置相关功能,只能推出一些新颖的自定义显示控件而已了。
至于控件,任何控件都可以复写
并且可以自定义View控件 当然也是可以自定义Button控件的。
具体代码:
packagecom.example.shudu;
importandroid.app.AlertDialog;
importandroid.content.Context;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.Paint.FontMetrics;
importandroid.view.LayoutInflater;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.widget.TextView;
publicclassShuduViewextendsView{
//单元格的宽度和高度
privatefloatwidth;
privatefloatheight;
privateGamegame=newGame();
publicShuduView(Contextcontext){
super(context);
}
@Override
protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){
//计算当前单元格的宽度和高度
this.width=w/9f;
this.height=h/9f;
super.onSizeChanged(w,h,oldw,oldh);
}
@Override
protectedvoidonDraw(Canvascanvas){
//生成用于绘制当前背景色的画笔
PaintbackgroundPaint=newPaint();
//设置背景颜色画笔的颜色
backgroundPaint.setColor(getResources().getColor(R.color.shudu_background));
//绘制背景色左边界都是0右边界位置是宽下边界是高覆盖整个屏幕
canvas.drawRect(0,0,getWidth(),getHeight(),backgroundPaint);
PaintdarkPaint=newPaint();
darkPaint.setColor(getResources().getColor(R.color.shudu_dark));
PainthilitePaint=newPaint();
hilitePaint.setColor(getResources().getColor(R.color.shudu_hilite));
PaintlightPaint=newPaint();
lightPaint.setColor(getResources().getColor(R.color.shudu_light));
for(inti=0;i<9;i++){
//以下两行代码用户绘制横向的单元格线并且利用像素差和颜色深浅变化显示出凹槽效果,增加逼真感。
canvas.drawLine(0,i*height,getWidth(),i*height,lightPaint);
canvas.drawLine(0,i*height+1,getWidth(),i*height+1,hilitePaint);
canvas.drawLine(i*width,0,i*width,getHeight(),lightPaint);
canvas.drawLine(i*width+1,0,i*width+1,getHeight(),hilitePaint);
}
for(inti=0;i<9;i++){
if(i%3!=0){
continue;
}
canvas.drawLine(0,i*height,getWidth(),i*height,darkPaint);
canvas.drawLine(0,i*height+1,getWidth(),i*height+1,hilitePaint);
canvas.drawLine(i*width,0,i*width,getHeight(),darkPaint);
canvas.drawLine(i*width+1,0,i*width+1,getHeight(),hilitePaint);
}
//绘制文字
PaintnumberPaint=newPaint();
numberPaint.setColor(Color.BLACK);
//设置空心
numberPaint.setStyle(Paint.Style.STROKE);
//设置文字大小为0.75单元格大小
numberPaint.setTextSize(height*0.75f);
//设置文字居中对齐
numberPaint.setTextAlign(Paint.Align.CENTER);
FontMetricsfm=numberPaint.getFontMetrics();
floatx=width/2;
floaty=height/2-(fm.ascent+fm.descent)/2;
System.out.println(y);
//x默认是‘3'这个字符的左边在屏幕的位置,如果设置了
//paint.setTextAlign(Paint.Align.CENTER);
//那就是字符的中心,y是指定这个字符baseline在屏幕上的位置
for(inti=0;i<9;i++)
for(intj=0;j<9;j++){
//将getLocaString方法声明成public是有必要的0是空字符串所以不显示的
canvas.drawText(game.getLocaString(i,j),i*width+x,j*height+y,numberPaint);
}
super.onDraw(canvas);
}
@Override
publicbooleanonTouchEvent(MotionEventevent){
if(event.getAction()!=MotionEvent.ACTION_DOWN){
returnsuper.onTouchEvent(event);//其实returntrue;也是一样的
}
//返回值是float类型的
intselectX=(int)(event.getX()/width);
intselectY=(int)(event.getY()/height);
intused[]=game.getUsedNums(selectX,selectY);
for(inti=0;i
新增加的类
packagecom.example.shudu;
importandroid.app.Dialog;
importandroid.content.Context;
importandroid.os.Bundle;
importandroid.view.View;
//该类用于实现Dialog,实现自定义的对话框功能这样的非Activity其实就是一个组件都是
//都是需要Context的参数的在运用的时候用来表明是哪一个应用程序调用了他
publicclassKeyDialogextendsDialog{
//用来存放代表对话框中的按钮对象
privatefinalViewkeys[]=newView[9];//Button能够这样使用他的父类自然也能够
privatefinalintused[];
//Context是必须的第二个参数int[]used保存着当前单元格已经使用过的数字
publicKeyDialog(Contextcontext,int[]used){
super(context);
this.used=used;
}
//当一个Dialog第一次显示的时候,会调用其onCreate方法
@Override
protectedvoidonCreate(BundlesavedInstanceState){
//TODOAuto-generatedmethodstub
super.onCreate(savedInstanceState);
//设置对话框的标题
setTitle("KeyDialog");
//设置布局文件
setContentView(R.layout.keypad);
//设置出九个按钮
findViews();
for(inti=0;i
TableLayout
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。