たぼさんの部屋

いちょぼとのんびり

P001_ver003) 算数アプリ

構成

f:id:donsuka_kk:20121120213422p:plain

実行結果

f:id:donsuka_kk:20121120212850p:plain

Main.java

package com.efolab.MainActivity;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.LinearLayout;

import com.efolab.MainActivity.Mondai.Mondai;
import com.efolab.MainActivity.MyContents.MyContents;
import com.efolab.MainActivity.MyInputPanel.MyInputPanel;

public class Main extends Activity {
	Context context;
	LinearLayout baseLayout;
	LinearLayout.LayoutParams params;
	
	// シーン定数
	public final static int 
		S_TITLE = 0, 
		S_PLAY = 1, 
		S_CLEAR = 2,
		S_GAMEOVER = 3;

	// システム
	
	/*
	 * 算数問題の設定
	 */
	//問題数:10問とか20問とか
	public static int mondai_length = 10;
	//算数コース:足し算、引き算、かけ算、割り算
	public static int mondai_course = 1;
	//桁数:1桁、2桁、3桁
	public static int mondai_keta = 1;
	//問題要素数:何個の数を計算するか
	public static int mondai_youso = 2;
	/*
	 * 問題と答えの保存
	 */
	ArrayList<Mondai> mondaiArray;

	private final int FP = ViewGroup.LayoutParams.FILL_PARENT,
			WC = ViewGroup.LayoutParams.WRAP_CONTENT;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//window
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		
		context = getApplicationContext();
		baseLayout = new LinearLayout(context);
		baseLayout.setOrientation(LinearLayout.VERTICAL);
		setContentView(baseLayout);

		// subLayout
		LinearLayout[] _contents = { new MyHeader(context),
				new MyContents(context), new MyInputPanel(context),
				new MyFooter(context) };
		int[][] _params = { { FP, WC }, { FP, 0 }, { FP, WC }, { FP, WC } };
		float[] _weight = { 0, 1.0f, 0, 0 };
		for (int i = 0; i < _contents.length; i++) {

			params = new LinearLayout.LayoutParams(_params[i][0], _params[i][1]);
			params.weight = _weight[i];

			baseLayout.addView(_contents[i], params);

		}

	}

	public static OnClickListener l = new OnClickListener() {

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			Log.v("OnClick", "" + v.getTag());
			MyContents.changeContentsText("" + v.getTag());
		}

	};

}

Mondai.java

package com.efolab.MainActivity.Mondai;

import java.util.ArrayList;

import android.content.Context;

public class Mondai{
	public static ArrayList<Mondai> kekka;
	public int kotae;
	public int seikai;
	public String mondaiStr;
	//コンストラクタ
	public Mondai(Context context) {
		/*
		 * 問題を生成
		 */
		
	}

	//乱数の生成
    private static int getIntRand(int min , int max){
    	int ret = (int)Math.floor(Math.random()*(max-min+1))+min;
//    	Log.v("ret","min="+min+",max="+max+",ret="+ret);
    	return ret;
    }

	//問題を文字列で返す
	public String getMondaiString(){
		
		return mondaiStr;
		
	}
	//答えを格納して、正解かどうかbooleanを返す
	public boolean setKotaeString(String kotae){
		boolean ret = false;
		
		return ret;
	}
}

MyContents.java

package com.efolab.MainActivity.MyContents;

import android.content.Context;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MyContents extends LinearLayout {
	static TextView tv;
	static MyKokuban kokuban;
	public MyContents(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		this.setOrientation(LinearLayout.VERTICAL);
		this.setPadding(10, 10, 10, 10);	//黒板の余白
		
		tv = new TextView(context);
		this.addView(tv);

		kokuban = new MyKokuban(context);
		this.addView(kokuban);
	}

	public static void changeContentsText(String str) {
		tv.setText(str);
		kokuban.setKotae(str);
	}

}

MyKokuban.java

package com.efolab.MainActivity.MyContents;

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

public class MyKokuban extends View{
	String kotaeStr = "";
	String mondaiStr = "";
	Paint paint;
	public MyKokuban(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		
		this.setBackgroundColor(Color.DKGRAY);	//黒板の色
		
		//paint
		paint = new Paint();
		paint.setColor(Color.WHITE);
		paint.setAntiAlias(true);
		paint.setTextSize(30);
		paint.setTypeface(Typeface.SANS_SERIF);	//フォント指定
		//test
		mondaiStr = "3 + 2 = ";
	}


	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		
		canvas.drawText(mondaiStr, 10, 30, paint);
		canvas.drawText(kotaeStr , 100 , 200 , paint);
	}
	
	public void setKotae(String ans){
		Log.v("","ans"+ans);
		if(ans.matches("ok")){
			mondaiStr += kotaeStr;
			kotaeStr = "";
		}
		else if(ans.matches("clear")){
			kotaeStr = "";
		}
		else{
			kotaeStr += ans;
		}
		invalidate();
	}

}

MyInputPanel.java

package com.efolab.MainActivity.MyInputPanel;

import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TableLayout;
public class MyInputPanel extends LinearLayout {
	@SuppressWarnings("unused")
	private static final int 
	WC = ViewGroup.LayoutParams.WRAP_CONTENT,
	FP = ViewGroup.LayoutParams.FILL_PARENT;
	public MyInputPanel(Context context) {
		super(context);
		
		Log.v("height","height="+this.getHeight());
	    this.setBackgroundColor(Color.LTGRAY);
		
	    //左側:比率0.6
		TableLayout tableLeft = new NumberTable(context);
		LinearLayout.LayoutParams lpLeft = new LinearLayout.LayoutParams(0 , FP);
		lpLeft.weight = 0.6f;
		this.addView(tableLeft , lpLeft);
		
		//右側:比率0.4
	    LinearLayout linearRight = new SubLinear(context);
	    LinearLayout.LayoutParams lpRight = new LinearLayout.LayoutParams(0 , FP);
	    lpRight.weight = 0.4f;
	    this.addView(linearRight , lpRight);
	}
}

NumberTable.java

package com.efolab.MainActivity.MyInputPanel;

import android.content.Context;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TableRow;

import com.efolab.MainActivity.Main;

public class NumberTable extends TableLayout{
	private static final int 
	WC = ViewGroup.LayoutParams.WRAP_CONTENT,
	FP = ViewGroup.LayoutParams.FILL_PARENT;
	public NumberTable(Context context) {
		super(context);
		//XXX thisはTableLayout
	    
	    /*
	     * TableLayolutの内容をセットする
	     */
	    
	    //1行目から3行目まで
	    Button[] buttons = new Button[9];
	    final int iMaxRow = 3;
	    final int iMaxCol = 3;
	    int index = 0;
	    for(int iRow=0;iRow<iMaxRow;iRow++){
	    	TableRow row = new TableRow(context);
	    	for(int iCol = 0;iCol<iMaxCol;iCol++){
	    		String value = ""+(index+1) % 10;
	    		//Buttonインスタンス
	    		buttons[index] = new Button(context);
	    		buttons[index].setText(value);
	    		buttons[index].setTag(value);
	    		//listener set
	    		buttons[index].setOnClickListener(Main.l);
	    		row.addView(buttons[index]);
	    		//buttons layout
	    		TableRow.LayoutParams _params = new TableRow.LayoutParams(0 , FP);
	    		_params.weight = 0.33f;
	    		buttons[index].setLayoutParams(_params);
	    		buttons[index].setGravity(Gravity.CENTER);
	    		
	    		index++;
	    	}
	    	this.addView(row);
	    	
	    }
	    //4行目に追加
	    TableRow row_4 = new TableRow(context);
	    Button btn_0 = new Button(context);
	    btn_0.setText("0");
	    btn_0.setTag("0");
	    row_4.addView(btn_0);
	    this.addView(row_4);
	    TableRow.LayoutParams lpRow_4 = new TableRow.LayoutParams(0 , WC);
	    lpRow_4.weight = 1.0f;	//横幅をいっぱいに
	    btn_0.setLayoutParams(lpRow_4);
	    
	    //listener set
	    btn_0.setOnClickListener(Main.l);

	}

}

SubLinear.java

package com.efolab.MainActivity.MyInputPanel;

import android.content.Context;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;

import com.efolab.MainActivity.Main;

public class SubLinear extends LinearLayout{
	@SuppressWarnings("unused")
	private static final int 
	WC = ViewGroup.LayoutParams.WRAP_CONTENT,
	FP = ViewGroup.LayoutParams.FILL_PARENT;
	public SubLinear(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		
		LinearLayout.LayoutParams lpLinear;
		this.setOrientation(LinearLayout.VERTICAL);
		
	    Button btn_cls = new Button(context);
	    btn_cls.setText("けす");
	    //LayoutParams インスタンス生成(1)
	    lpLinear = new LinearLayout.LayoutParams(FP,0);
	    lpLinear.weight = 0.25f;
	    this.addView(btn_cls ,lpLinear);
	    
	    Button btn_ok = new Button(context);
	    btn_ok.setText("こたえ");
	    //LayoutParams インスタンス生成(2) --それぞれにインスタンス生成必要
	    lpLinear = new LinearLayout.LayoutParams(FP,0);
	    lpLinear.weight = 0.75f;
	    this.addView(btn_ok, lpLinear);
	    
	    
	    //setTag
	    btn_cls.setTag("clear");
	    btn_ok.setTag("ok");
	    //set Listener
	    btn_cls.setOnClickListener(Main.l);
	    btn_ok.setOnClickListener(Main.l);
	}

}