主要涉及的知识是用Android进行绘图
需要自己创建一个从View派生的类,重写OnDraw事件
class MyView extends View{ public MyView(Context context) { super(context); setFocusable(true);//允许获得焦点 setFocusableInTouchMode(true); } //绘图 @Override protected void onDraw(Canvas canvas) { //.... } }
在Activity中使用此对象,完整结构:
public class MyGame extends Activity { { MyView myView;//自定义视图 @Override public void onCreate(Bundle savedInstanceState) { initGame(); super.onCreate(savedInstanceState); myView=new MyView(this); setContentView(myView); } //自己从MyView派生一个View对象用于绘图 class MyView extends View{ public MyView(Context context) { super(context); setFocusable(true);//允许获得焦点 setFocusableInTouchMode(true); } //绘图 @Override protected void onDraw(Canvas canvas) { //.... } } }
绘图需要一个类似画笔一样的对象Paint:
//创建一个填充画笔 private Paint createPaint(int color){ Paint p=new Paint(); p.setColor(color); return p; }
在OnDraw中绘制背景和线条,为了达到立体感觉我绘了两条线
int unitw;//单位长度 //计算单位长度 @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); unitw= ((w>h)?h:w)/9; } //绘图 @Override protected void onDraw(Canvas canvas) { int w=unitw; super.onDraw(canvas); //画背景 Paint background= createPaint(Color.parseColor("#E8F2FE")); canvas.drawRect(0,0,getWidth(),getHeight(),background); //画水平细 for(int i=0;i<=9;i++){ canvas.drawLine(i*w-2, 0, i*w-2,9*w, createPaint(Color.parseColor((i%3!=0)?"#666666":"#cccccc"))); canvas.drawLine(i*w, 0, i*w,9*w, createPaint((i%3!=0)?Color.WHITE:Color.BLACK) ); } //画垂直线 for(int i=0;i<=9;i++){ canvas.drawLine(0,i*w-2, 9*w,i*w-2, createPaint(Color.parseColor((i%3!=0)?"#666666":"#cccccc"))); canvas.drawLine(0,i*w, 9*w,i*w, createPaint((i%3!=0)?Color.WHITE:Color.BLACK)); }
绘制完成后效果:
下来是绘制单元格:
定义两个变量用来保存当前的坐标,在OnDraw中绘图
int selX=0,selY=0;//保存当前选择的对象的坐标 //获取要绘制的矩形范围 private RectF getRect() { return new RectF(selX*unitw+2, selY*unitw+2, selX*unitw+unitw-4,selY*unitw+unitw-4); } protected void onDraw(Canvas canvas) { //.... if(selX>-1 && selY>-1){ canvas.drawRect(getRect(),createPaint(Color.parseColor("#0000FF")) ); } }
效果如下:
编写键盘事件,通过上下左右控制当前光标的移动,点击界面光标移动
,重新设置selX,selY的值
public class MyGame extends Activity { //键盘事件 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_DOWN: selY++;break; case KeyEvent.KEYCODE_DPAD_UP: selY--;break; case KeyEvent.KEYCODE_DPAD_LEFT: selX--;break; case KeyEvent.KEYCODE_DPAD_RIGHT: selX++;break; default: return super.onKeyDown(keyCode, event); } if(selY>8) selY=0; if(selY<0) selY=8; if(selX>8) selX=0; if(selX<0) selX=8; myView.clearFocus(); return true; } } class MyView extends View{ //点击事件 @Override public boolean onTouchEvent(MotionEvent event) { //计算点击区域 int n=(int) (event.getX()/unitw); int m=(int) (event.getY()/unitw); if(n<9){selX=n;} if(m<9){selY=m;} clearFocus();//重绘 return super.onTouchEvent(event); } }
待续!
最后给出完整代码:
package com.haha; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.os.Bundle; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; public class MyGame extends Activity { int selX=0,selY=0;//保存当前选择的对象的坐标 int unitw;//单位长度 MyView myView;//自定义视图 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView=new MyView(this); setContentView(myView); } //键盘事件 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_DOWN: selY++;break; case KeyEvent.KEYCODE_DPAD_UP: selY--;break; case KeyEvent.KEYCODE_DPAD_LEFT: selX--;break; case KeyEvent.KEYCODE_DPAD_RIGHT: selX++;break; default: return super.onKeyDown(keyCode, event); } if(selY>8) selY=0; if(selY<0) selY=8; if(selX>8) selX=0; if(selX<0) selX=8; myView.clearFocus(); return true; } //自己从MyView派生一个View对象用于绘图 class MyView extends View{ //点击事件 @Override public boolean onTouchEvent(MotionEvent event) { //计算点击区域 int n=(int) (event.getX()/unitw); int m=(int) (event.getY()/unitw); if(n<9){selX=n;} if(m<9){selY=m;} clearFocus();//重绘 return super.onTouchEvent(event); } public MyView(Context context) { super(context); setFocusable(true);//允许获得焦点 setFocusableInTouchMode(true); } //计算单位长度 @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); unitw= ((w>h)?h:w)/9; } //绘图 @Override protected void onDraw(Canvas canvas) { int w=unitw; super.onDraw(canvas); //画背景 Paint background= createPaint(Color.parseColor("#E8F2FE")); canvas.drawRect(0,0,getWidth(),getHeight(),background); //画水平细 for(int i=0;i<=9;i++){ canvas.drawLine(i*w-2, 0, i*w-2,9*w, createPaint(Color.parseColor((i%3!=0)?"#666666":"#cccccc"))); canvas.drawLine(i*w, 0, i*w,9*w, createPaint((i%3!=0)?Color.WHITE:Color.BLACK) ); } //画垂直线 for(int i=0;i<=9;i++){ canvas.drawLine(0,i*w-2, 9*w,i*w-2, createPaint(Color.parseColor((i%3!=0)?"#666666":"#cccccc"))); canvas.drawLine(0,i*w, 9*w,i*w, createPaint((i%3!=0)?Color.WHITE:Color.BLACK)); } if(selX>-1 && selY>-1){ canvas.drawRect(getRect(),createPaint(Color.parseColor("#0000FF")) ); } } //获取要绘制的矩形范围 private RectF getRect() { return new RectF(selX*unitw+2, selY*unitw+2, selX*unitw+unitw-4,selY*unitw+unitw-4); } //创建一个填充画笔 private Paint createPaint(int color){ Paint p=new Paint(); p.setColor(color); return p; } } }