現在Androidアプリを製作しているのですが、具体的な内容としては
canvasを利用したお絵かき機能と
(筆記時間)→(手を離している時間)→(筆記時間)→(手を離している時間)→(筆記時間)→・・・
を一個一個計測し、記録できるストップウォッチを組み合わせたものとなっています。
進行状況としましては
筆記時間、手を離している時間を連続で測定できるストップウォッチと、canvasで自由にお絵かきできるプログラムはそれぞれ別個に完成しています。
しかし、これら2つの.javaを同じパッケージ内に入れて動作させたところ
・お絵かきするために設定した箇所をタッチすると、お絵かきはできるがストップウォッチが動作しない
・お絵かき用に設定した箇所以外をタッチすると、ストップウォッチが動作する
といった問題がおきています。
解決のためにcanvasのonTouchの方にストップウォッチのコードを書き移したり、layoutの順序を変える等も試してみました。
しかし、どれも予期せぬエラーのためアプリが強制終了してしまうといった状態でした。
自分のプログラムの知識は、大学でC言語のif文、for文、配列を勉強した程度でして、javaというものは触れてまだ2週間程度です。
明らかな勉強不足ですが、期限が近いこともあり自分だけでは解決できないと判断したので質問させていただきました。
どのようにすれば理想とした動作をさせることができるのでしょうか?回答やアドバイス、お願い致します。
public class MainActivity extends Activity {
ArrayAdapter<String> adapter;
//CanvasView View;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
ArrayList<String> laptime = new ArrayList<String>();
//指の動きに応じてストップウォッチ起動&ラップ保存
@Override
public boolean onTouchEvent(MotionEvent event) {
//View =new CanvasView(this);
//setContentView(View);
adapter = new ArrayAdapter<String>(
this, android.R.layout.simple_list_item_1,laptime);
ListView list = (ListView)findViewById(R.id.list);
list.setAdapter(adapter);
countText = (TextView)findViewById(R.id.Counter);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN :
//ifでn==0なら"開始"を表示し、そうでなら手を離していた時間(×)を表示
if(n==0){
laptime.add("開始");
loopEngine.start();
startDate =System.currentTimeMillis();
n++;
}
else{
laptime.add("×"+" : "+String.valueOf(System.currentTimeMillis()-startDate));
loopEngine.start();
startDate =System.currentTimeMillis();
n++;
}
break;
case MotionEvent.ACTION_UP:
//n個目の○を筆記してる時間
laptime.add(n+"個目"+" : "+String.valueOf(System.currentTimeMillis()-startDate));
loopEngine.start();
startDate =System.currentTimeMillis();
break;
}
return true;
}
// カウントを表示するテキストボックス
TextView countText;
public long startDate;
public long n=0;
public void update(){
//(現在時刻)-(スタート時刻)を表示
countText.setText(String.valueOf(System.currentTimeMillis()-startDate));
}
//一定時間後にupdateを呼ぶためのオブジェクト
class LoopEngine extends Handler {
private boolean isUpdate;
public void start(){
this.isUpdate = true;
handleMessage(new Message());
}
public void stop(){
this.isUpdate = false;
}
@Override
public void handleMessage(Message msg) {
this.removeMessages(0);//既存のメッセージは削除
if(this.isUpdate){
MainActivity.this.update();//自信が発したメッセージを取得してupdateを実行
sendMessageDelayed(obtainMessage(0), 10);//10ミリ秒後にメッセージを出力
}
}
};
protected LoopEngine loopEngine = new LoopEngine();
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
//参考:初めてのAndroidアプリ開発Android4対応版 秀和システム 山田 祥寛(著)
public class CanvasView extends View {
Path path;
Paint p;
public CanvasView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public CanvasView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CanvasView(Context context) {
super(context);
init();
}
private void init() {
p = new Paint();
p.setColor(Color.BLUE);
p.setStrokeWidth(3);
p.setStyle(Paint.Style.STROKE);
p.setStrokeJoin(Paint.Join.ROUND);
path = new Path();
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawPath(path, p);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN :
path.moveTo(event.getX(), event.getY());
break;
case MotionEvent.ACTION_MOVE:
path.lineTo(event.getX(), event.getY());
break;
case MotionEvent.ACTION_UP:
path.lineTo(event.getX(), event.getY());
break;
}
invalidate();
return true;
}
}