第27回 Androidスクロールビューでタッチイベント
スクロールビューに名前の入ったビューアイテムが乗っています。スクロールビューのタッチイベントは嫌なので、このビューアイテムにタッチイベントをセットすることにしました。
私は、アマプログラマーなので、やれることだけしかしません。できるだけ難しいことは避ける。厳しいルートは通らない軟弱な登山家みたいなものです。
さて、タッチイベントですが、今回はAndroid版だけです。
RunnerEntryView.java(抜粋)
@Override public boolean onTouchEvent(MotionEvent event) { int touch = event.getAction(); // タッチの種類を格納する float posX = event.getX(); // 位置を保存する float posY = event.getY(); switch (touch) { case MotionEvent.ACTION_DOWN: // code break; case MotionEvent.ACTION_MOVE: // code break; case MotionEvent.ACTION_UP: if (entry) { entry = false; entryCancel.run(); // Runnerクラスへのアクセス } else { entry = true; entryOk.run(); // Runnerクラスへのアクセス } invalidate(); // このビューの再描画 break; case MotionEvent.ACTION_CANCEL: // cede break; default: break; } return true; }
タッチアップが発生すると、内部のフラグentryを確認し、true、falseを切り替えています。それだけです。簡単ですね。
ただ、後で、利用するため、runnerオブジェクトに状態を通知します。
そのためにランナブルがついています。
もう一つ、ユーザーに状態を示すために、invalidate()が。
これは、Viewに対して、再描画と指示するものです。(と理解するのが単純でいいのです。直訳では「無効にする」なんですが。)
で、invalidate()で動作するのが、drawメソッドなんですね。
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (entry) { setBackgroundColor(Color.argb(255,255,255,30)); } else { setBackgroundColor(Color.argb(255,200,200,200)); } final float numberWidth = myWidth * 0.22f; // アンドロイドではcanvasを使用する,canvasは呼び出し元にあるので引数で受け取る // android では Paintクラスを使って色やスタイルを決めていく Paint paint = new Paint(); // 両サイド paint.setStrokeWidth(lineWidth); paint.setColor(Color.BLACK); canvas.drawLine(lineWidth/2, 0, lineWidth/2, myHeight,paint); canvas.drawLine(myWidth-lineWidth/2, 0, myWidth-lineWidth/2, myHeight,paint); // 上下サイド paint.reset(); paint.setColor(Color.BLACK); paint.setStrokeWidth(lineWidth*0.3f); canvas.drawLine(0,lineWidth*0.15f,myWidth,lineWidth*0.15f,paint); canvas.drawLine(0,myHeight-lineWidth*0.15f,myWidth,myHeight-lineWidth*0.15f,paint); (以下略)
entryの状態を見て、背景色を変えています。
タップすると、色が変わります。
これはライティングのゲームには使えそうですね。
いい感じで反応してくれます。