天天看點

數獨設計(4)

經過了前兩天的設定後,我們就可以再View類中,進行遊戲的布置,和進行操作了。

package com.mars.demo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class MyView extends View
{
	//定義單元格的寬和高
	public float width;
	public float height;
	
	private int selectX;
	private int selectY;
	
	public Game game = new Game();
	
	public MyView(Context context)
	{
		super(context);
		// TODO Auto-generated constructor stub
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh)
	{
		// TODO Auto-generated method stub
		this.width = w/9f;
		this.height = h/9f;
		super.onSizeChanged(w, h, oldw, oldh);
	}
	
	
	
	@Override
	protected void onDraw(Canvas canvas)
	{
		//定義畫筆對象-->繪制背景
		Paint paint = new Paint();
		//設定畫筆的顔色
		paint.setColor(getResources().getColor(R.color.shudu_background));
		//繪制手機螢幕背景色
		canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
		
		
		//定義畫筆對象-->繪制格子線條
		Paint darkPaint = new Paint();
		darkPaint.setColor(getResources().getColor(R.color.shudu_dark));
		
		Paint hilitePaint = new Paint();
		hilitePaint.setColor(getResources().getColor(R.color.shudu_hilite));
		
		Paint lightPaint = new Paint();
		lightPaint.setColor(getResources().getColor(R.color.shudu_light));
		
		//繪制九宮格
		for(int i = 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循環是繪制四根醒目的線
		for(int i = 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);
		}
		
		
		//繪制數字
		Paint numberPaint = new Paint();
		//設定文字的一系列屬性
		numberPaint.setColor(Color.BLACK);
		numberPaint.setStyle(Paint.Style.STROKE);
		numberPaint.setTextSize(height*0.75f);
		numberPaint.setTextAlign(Paint.Align.CENTER);
		
		
		FontMetrics fontMetrics = numberPaint.getFontMetrics();
		float x = width/2;
		float y = height/2 - (fontMetrics.ascent+fontMetrics.descent)/2;
		
		for(int i=0; i<9; i++)
			for(int j=0; j<9; j++)
			{
				canvas.drawText(game.getTitleString(i, j), i*width + x, j*height+y, numberPaint);
			}
		
		super.onDraw(canvas);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event)
	{
		// TODO Auto-generated method stub
		if(event.getAction() != MotionEvent.ACTION_DOWN)
		{
			return super.onTouchEvent(event);
		}
		
		selectX = (int)(event.getX()/width);
		selectY = (int)(event.getY()/height);
		
		int[] used = game.getUsedTile(selectX, selectY);
		StringBuffer sb = new StringBuffer();
		for(int i = 0; i<used.length; i++)
		{
			sb.append(used[i]);
		}
		Log.i("TAG", sb.toString());
		
		KeyDialog keyDialog = new KeyDialog(this.getContext(), used, this);
		keyDialog.show();
		
		/*//定義一個layoutInflate對象,轉載view檔案
		LayoutInflater layoutInflater = LayoutInflater.from(this.getContext());
		View view = layoutInflater.inflate(R.layout.dialog, null);
		
		TextView textView = (TextView) view.findViewById(R.id.usedTextId);
		textView.setText(sb.toString());
		//建立對話框,彈出view
		AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext());
		
		builder.setView(view);
		AlertDialog dialog = builder.create();
		dialog.show();*/
	
		return true;
	}
	
	//View類接受KeyDialog傳遞過來的資料,調用業務邏輯Game類,進行處理
	public void setSelectTile(int tile)
	{
		Log.i("TAG", game.setTileIfValid(selectX, selectY, tile)+""+tile);
		if(game.setTileIfValid(selectX,selectY,tile))
		{
			invalidate();//重新繪制View對象
		}
	}
	
}
      

 在主類中調用MyView對象。

package com.mars.demo;

import android.os.Bundle;
import android.app.Activity;

public class MainActivity extends Activity
{

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		//setContentView(R.layout.activity_main);
		setContentView(new MyView(this));
	}


}
      

通過上面數獨遊戲的學習,我了解了Paint類,Canvas類。我學習了一些繪制圖形的基本知識,進一步鞏固了一些android的基本知識。從中,我發現,作為一個程式員,一定要不斷的去敲代碼,勇于去實踐,程式時敲出來的。很多時候,我們看别人寫程式,感覺邏輯都很清晰,思路也不紊亂,但是,真正當自己去實踐的時候,你會發現,其實并不是那麼容易。當你出現問題的時候,你得嘗試去調試,這樣,我們才能不斷成長。

程式員都是在調試Bug,調試錯誤中成長起來的。這是我非常贊同的一句話。在此,給自己一句勉勵的話,希望自己在今後的學習日子中,不怕困難,用于去嘗試。

上一篇: 做漢堡