フリープログラマー日記

iOS,アンドロイド開発を気ままにしながら生きてるおじさんのブログです。

第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の状態を見て、背景色を変えています。

タップすると、色が変わります。

これはライティングのゲームには使えそうですね。
いい感じで反応してくれます。

f:id:momonga117:20180526093704p:plain