3

いくつかのボタンがあり、そのうちの 1 つを押して、別のボタンを押しながらドラッグしたいと思います。MotionEventどの機能または別の機能を使用すればよいか教えてください。を使用してonTouchListenerいます。

私がやりたいことを確認できる画像があります(最初ACTION_DOWNに1番目のボタンを押し、2番目から7番目のボタンをドラッグして画面を押したままにします)、最後にすべての白いボタンを押します:

ここに画像の説明を入力

以下は私のonTouchボタンコードです:

button1 = (Button) findViewById(R.id.button1);

        button1.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                    switch (event.getAction())
                    {
                        case MotionEvent.ACTION_DOWN:
                            soundIDs[0] = sound.play(R.raw.sample1);
                            button1.setBackgroundResource(R.drawable.white_clicked);
                            break;
                        case MotionEvent.ACTION_UP:
                        case MotionEvent.ACTION_CANCEL:
                            sound.stop(soundIDs[0]);
                            button1.setBackgroundResource(R.drawable.white);
                            break;
                    }
            return false;
            }
        });
4

1 に答える 1

2

1つのボタンだけでOnTouchListenerを設定しています。これは、ポインタが別のボタンに移動したとき(たとえば、ユーザーが指をドラッグしたとき)を知るのに役立ちません。

ボタンを含むビューにOnTouchListenerを設定できます。次に、ACTION_DOWN、ACTION_MOVE、およびACTION_UPイベントを確認します。次に、アクティブにするボタンを特定するために、いくつかの簡単なヒット検出を実行する必要があります。

次のようなもの:

getWindow().getDecorView()
    .findViewById(android.R.id.content)
    .setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View arg0, MotionEvent event) {
            int action = event.getAction();
            if (action != MotionEvent.ACTION_DOWN 
                && action != MotionEvent.ACTION_MOVE 
                && action != MotionEvent.ACTION_UP) return false;

            Rect hitRect = new Rect();
            Button button;
            for(int i = 0; i < myButtons.size(); i++) {
                button = myButtons.get(i);
                button.getHitRect(hitRect);
                if (hitRect.contains((int)event.getX(), (int)event.getY())) {
                    button.setText("hit!");
                }
            }
            return true;
        }

    });

ここで、myButtonsはボタンのArrayListです(例ではピアノのキー)。

また、ユーザーのタッチがボタンを離れたが別のボタンを押さなかった場合に、現在アクティブなボタンを適切に非アクティブ化するようにこれを変更することをお勧めします。

上記のコードを、3つのボタンが連続したレイアウトのAndroidデバイスでテストしました。すべてのボタンを指でドラッグすると、各ボタンのテキストが「ヒット!」に変わります。

上で述べたように、タッチリスナーをボタン1つだけに設定していましたが、これは機能しません。この例では、アクティビティのビュー全体にタッチリスナーを設定しました。

于 2012-12-15T00:32:15.977 に答える