现在的位置: 首页 > 综合 > 正文

Android3系列 -2.数独游戏开发1

2014年02月08日 ⁄ 综合 ⁄ 共 4954字 ⁄ 字号 评论关闭

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

 

抱歉!评论已关闭.