主要涉及的知识是用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;
}
}
}