package com.efolab.p003;
import java.lang.ref.WeakReference;
import android.app.Activity;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Window;
import android.widget.LinearLayout;
import com.efolab.p003.kekkaActivity.KekkaActivity;
import com.efolab.p003.mainActivity.MyFooter;
import com.efolab.p003.mainActivity.MyHeader;
import com.efolab.p003.mainActivity.MyKokuban;
import com.efolab.p003.mainActivity.NumberTable;
import com.efolab.p003.mainActivity.SubLinear;
public class Main extends Activity {
Context context;
private final int FP = LinearLayout.LayoutParams.FILL_PARENT;
private final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;
LinearLayout layout_base;
MyKokuban kokuban;
NumberTable numberTable;
SubLinear subLinear;
MyHeader mHeader;
MyFooter mFooter;
Thread thread;
static Handler mainHandler;
public final static int WHAT_INPUT_CLICK = 0, WHAT_KOKUBAN_TOUCH = 1;
public final static int S_TITLE = 0;
public final static int S_PLAY = 1;
public final static int S_GAMEOVER = 2;
private static int scene = S_TITLE;
int mondaiLength = 3;
int maxTime = 500;
int keikaTime = 0;
int countUpTime = 10;
int score = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
context = getApplicationContext();
layout_base = new LinearLayout(context);
layout_base.setOrientation(LinearLayout.VERTICAL);
layout_base.setBackgroundColor(Color.WHITE);
setContentView(layout_base);
mainHandler = new MainHandler(this);
XXX
Log.v("Main onClreate", "Thread" + Thread.currentThread().getId());
String layoutNames[] = {"layout_header" , "layout_main" , "layout_input" , "layout_footer"};
LinearLayout.LayoutParams params;
LinearLayout[] mLayouts = { new LinearLayout(context),
new LinearLayout(context), new LinearLayout(context),
new LinearLayout(context) };
int[][] paramsArray = { { FP, WC }, { FP, 0 }, { FP, WC }, { FP, WC } };
float[] paramsWeight = { 0, 1.0f, 0, 0 };
for (int i = 0; i < mLayouts.length; i++) {
params = new LinearLayout.LayoutParams(paramsArray[i][0], paramsArray[i][1]);
params.weight = paramsWeight[i];
layout_base.addView(mLayouts[i], params);
mLayouts[i].setTag(layoutNames[i]);
if(layoutNames[i].matches("layout_header")){
mHeader = new MyHeader(context);
params = new LinearLayout.LayoutParams(FP,WC);
mLayouts[i].addView(mHeader,params);
}
if(layoutNames[i].matches("layout_main")){
kokuban = new MyKokuban(context, mainHandler);
params = new LinearLayout.LayoutParams(FP, WC);
Log.d("LayoutParams.debug()",params.debug("layout_main params:"));
mLayouts[i].addView(kokuban,params);
mLayouts[i].setPadding(10, 10, 10, 10);
}
if(layoutNames[i].matches("layout_input")){
numberTable = new NumberTable(context, mainHandler);
params = new LinearLayout.LayoutParams(0, FP , 0.6f);
mLayouts[i].addView(numberTable, params);
subLinear = new SubLinear(context, mainHandler);
mLayouts[i].addView(subLinear ,new LinearLayout.LayoutParams(0, FP , 0.4f));
}
if(layoutNames[i].matches("layout_footer")){
mFooter = new MyFooter(context);
params = new LinearLayout.LayoutParams(FP,WC);
mLayouts[i].addView(mFooter,params);
}
}
thread = new Thread(runner);
thread.start();
}
@Override
protected void onResume() {
super.onResume();
TODO
thread = new Thread(runner);
thread.start();
}
Runnable runner = new Runnable() {
@Override
public void run() {
XXX
Log.v("Main runner", "Thread" + Thread.currentThread().getId());
keikaTime = 0;
String str;
while (thread != null) {
if (getScene() == S_TITLE) {
str = "げーむをはじめる";
kokuban.setMessage(str);
} else if (getScene() == S_PLAY) {
doMondai();
} else if (getScene() == S_GAMEOVER) {
str = "おわり";
kokuban.setMessage(str);
thread = null;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
thread = null;
setScene(S_GAMEOVER);
}
};
private void doMondai() {
for (int i = 0; i < mondaiLength; i++) {
kokuban.setMondaiNo("" + (i + 1) + "問目");
keikaTime = 0;
while (keikaTime < maxTime) {
try {
Thread.sleep(countUpTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
keikaTime += countUpTime;
}
}
setScene(S_GAMEOVER);
}
public static int getScene() {
return scene;
}
public static void setScene(int scene) {
Main.scene = scene;
}
MainHandler static 内部クラス
private static class MainHandler extends Handler {
private final WeakReference<Main> mActivity;
public MainHandler(Main activity) {
mActivity = new WeakReference<Main>(activity);
XXX
Log.v("MainHandler Constractor", "Thread"
+ Thread.currentThread().getId());
}
@Override
public void handleMessage(Message message) {
XXX
Log.v("MainHandler handleMessage", "Thread"
+ Thread.currentThread().getId());
Main activity = mActivity.get();
if (activity == null)
return;
switch (message.what) {
case WHAT_KOKUBAN_TOUCH:
if (Main.getScene() == Main.S_TITLE) {
Main.setScene(Main.S_PLAY);
} else if (Main.getScene() == Main.S_GAMEOVER) {
Intent intent = new Intent(
activity.getApplicationContext(),
KekkaActivity.class);
PendingIntent pending = PendingIntent.getActivity(
activity.getApplicationContext(), 0, intent, 0);
try {
pending.send();
} catch (CanceledException e) {
e.printStackTrace();
}
}
TODO
break;
case WHAT_INPUT_CLICK:
activity.kokuban.setKotae("" + message.obj);
break;
}
}
}
}
MyNumberTable.java
package com.efolab.p003.mainActivity;
import com.efolab.p003.Main;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TableRow;
public class NumberTable extends TableLayout{
private static final int
WC = ViewGroup.LayoutParams.WRAP_CONTENT,
FP = ViewGroup.LayoutParams.FILL_PARENT;
Handler mainHandler ;
public NumberTable(Context context , Handler h) {
super(context);
mainHandler = h;
XXX
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;
buttons[index] = new Button(context);
buttons[index].setText(value);
buttons[index].setTag(value);
buttons[index].setOnClickListener(inputListener);
row.addView(buttons[index]);
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);
}
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);
btn_0.setOnClickListener(inputListener);
}
OnClickListener inputListener = new OnClickListener() {
@Override
public void onClick(View v) {
Message msg = Message.obtain();
msg.what = Main.WHAT_INPUT_CLICK;
msg.obj = ("" + v.getTag());
mainHandler.sendMessage(msg);
}
};
}
SubLinear.java
package com.efolab.p003.mainActivity;
import com.efolab.p003.Main;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
public class SubLinear extends LinearLayout{
@SuppressWarnings("unused")
private static final int
WC = ViewGroup.LayoutParams.WRAP_CONTENT,
FP = ViewGroup.LayoutParams.FILL_PARENT;
Handler mainHandler;
public SubLinear(Context context ,Handler h) {
super(context);
TODO
mainHandler = h;
LinearLayout.LayoutParams params;
this.setOrientation(LinearLayout.VERTICAL);
Button btn_cls = new Button(context);
btn_cls.setText("けす");
params = new LinearLayout.LayoutParams(FP,0);
params.weight = 0.25f;
this.addView(btn_cls ,params);
Button btn_ok = new Button(context);
btn_ok.setText("こたえ");
params = new LinearLayout.LayoutParams(FP,0);
params.weight = 0.75f;
this.addView(btn_ok, params);
btn_cls.setTag("clear");
btn_ok.setTag("ok");
btn_cls.setOnClickListener(inputListener);
btn_ok.setOnClickListener(inputListener);
}
OnClickListener inputListener = new OnClickListener() {
@Override
public void onClick(View v) {
Message msg = Message.obtain();
msg.what = Main.WHAT_INPUT_CLICK;
msg.obj = ("" + v.getTag());
mainHandler.sendMessage(msg);
}
};
}
MyKokuban.java
package com.efolab.p003.mainActivity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import com.efolab.p003.Main;
@SuppressLint("ViewConstructor")
public class MyKokuban extends View{
XXX
String kotaeStr = "";
String mondaiStr = "";
String message = "";
String mondaiNo = "";
Paint paint;
Handler mainHandler;
public MyKokuban(Context context , Handler h) {
super(context);
mainHandler = h;
this.setBackgroundColor(Color.DKGRAY);
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
paint.setTextSize(30);
this.setOnTouchListener(kokubanTouchListener);
}
@Override
protected void onDraw(Canvas canvas) {
TODO
super.onDraw(canvas);
canvas.drawText(mondaiStr, 10, 100, paint);
canvas.drawText(kotaeStr , 100 , 200 , paint);
canvas.drawText(message, 50, 100, paint);
canvas.drawText(mondaiNo, 10, 30, paint);
}
Handler mHandler_1 = new Handler();
public void setMessage(final String str){
XXX
mHandler_1.post(new Runnable(){
@Override
public void run() {
TODO
message = str;
invalidate();
}});
}
public void setMondai(String mondai){
message = null;
}
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();
}
Handler mHandler_2 = new Handler();
public void setMondaiNo(final String str){
mHandler_2.post(new Runnable(){
@Override
public void run() {
TODO
mondaiNo = str;
invalidate();
}});
}
OnTouchListener kokubanTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
Message msg = Message.obtain();
msg.what = Main.WHAT_KOKUBAN_TOUCH;
msg.obj = v;
TODO
mainHandler.sendMessage(msg);
}
return true;
}
};
}