0

2つのボタンがあり、押すと音が出ます。両方の音を同時に聞くには、両方を同時に押したいと思います。ここのところ:

@Override // ナビゲーション矢印のタッチを処理 public boolean onTouch(View v, MotionEvent event) {

    int action = event.getActionMasked();

    switch (action){

    case MotionEvent.ACTION_DOWN:
         switch (v.getId()) { // Which button?
            case R.id.cnotebutton: // The upArrow
                Log.i("C", "C");
              //  mSoundPool.stop(mStream1);
                //mStream1= mSoundPool.play(mSoundPoolMap.get(1), streamVolume, streamVolume, 1,0, 1f);
                break;
            case R.id.dnotebutton: // The downArrow
                  Log.i("D", "D");
                 // mSoundPool.stop(mStream2);
                //mStream2= mSoundPool.play(mSoundPoolMap.get(2), streamVolume, streamVolume, 1,0, 1f);
                break;
            default:
            }

            break;
        case MotionEvent.ACTION_UP:

            break;  
        case MotionEvent.ACTION_POINTER_DOWN:
             switch (v.getId()) { // Which button?
                case R.id.cnotebutton: // The upArrow
                    Log.i("C", "C");
                  //  mSoundPool.stop(mStream1);
                    //mStream1= mSoundPool.play(mSoundPoolMap.get(1), streamVolume, streamVolume, 1,0, 1f);
                    break;
                case R.id.dnotebutton: // The downArrow
                      Log.i("D", "D");
                     // mSoundPool.stop(mStream2);
                    //mStream2= mSoundPool.play(mSoundPoolMap.get(2), streamVolume, streamVolume, 1,0, 1f);
                    break;
                default:
                }
            break;
        case MotionEvent.ACTION_POINTER_UP:

            break;
        case MotionEvent.ACTION_MOVE:

            break;
        default:

    }
    return true;
}

それは動作しません。これをどのように解決すればよいですか?もう 1 つの質問ですが、画面上で指を動かした場合、指を上げずにボタンに到達したときにボタンを押したいと思います。ACTION_MOVE も機能しません。ばかげた質問で申し訳ありませんが、私はこの分野ではかなり初心者です。

アップデート

このコードではマルチタッチを検出しますが、常に同じボタンを両方の指で触れたかのように、常に 2 つの同じログを取得します。したがって、2つのボタンを同時に押しても、ログ「C」と別の「C」が表示されますが、これは間違っています.CとDを取得する必要があります.

前もってありがとう!

4

2 に答える 2

0

SurfaceView で遊んでいますか? ではないかという感じです。各ボタンの OnClickListener を単純に設定してみませんか?

それ以外の場合は、各タッチ イベントに個別にアクセスする必要があります。あなた

サージ

于 2012-12-04T21:46:09.470 に答える
0

コードは次のようになっていますか? いくつかの重要なポイントを強調しました

パッケージ be.domore.smokesignaltest;

android.app.Activity をインポートします。android.os.Bundle をインポートします。android.view.MotionEvent をインポートします。android.view.View をインポートします。android.view.View.OnTouchListener をインポートします。android.widget.Button をインポートします。

public class DummyActivity extends Activity implement OnTouchListener { private Button myButton1; プライベート ボタン myButton2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the content view
    setContentView(R.layout.activity_dummy);

    // Map controls
    mapControls();
}

private void mapControls() {
    myButton1 = (Button) findViewById(R.id.myButton1);
    myButton1.setOnTouchListener(this);

    myButton2 = (Button) findViewById(R.id.myButton2);
    myButton2.setOnTouchListener(this);
}

public boolean onTouch(View v, MotionEvent event) {
    **if (event.getAction() == MotionEvent.ACTION_DOWN)**
        switch (v.getId()) {
        case R.id.myButton1:
            // TODO: put your code here
            **return true;**
        case R.id.myButton2:
            // TODO: put your code here
            **return true;**
        }

    *return false;*
}

}

次のクラスは、サウンドを管理するために作成したヘルパーです。興味深い部分は、関数 AssignSoundToView です。それがあなたを助けるかどうかわかりませんか?

パッケージ be.domore.FingerTwister.Game;

import java.io.IOException;

be.domore.FingerTwister.Settings をインポートします。

android.app.Activity をインポートします。android.content.res.AssetFileDescriptor をインポートします。android.content.res.AssetManager をインポートします。android.media.AudioManager をインポートします。android.media.MediaPlayer をインポートします。android.media.SoundPool をインポートします。android.util.Log をインポートします。android.view.MotionEvent をインポートします。android.view.View をインポートします。android.view.View.OnTouchListener をインポートします。

public class SoundManager2 { private static SoundManager2 current = new SoundManager2();

public static SoundManager2 getCurrent() {
    return current;
}

private boolean initialized = false;
private MediaPlayer player;
private SoundPool pool;
private AssetManager assetManager;

private int[] soundId = new int[Sounds.values().length];
private int[] soundStream = new int[Sounds.values().length];

private SoundManager2() {

}

public void assignSoundToView(View view, Sounds sound) {
    final int currentSound;

    if (Settings.hasFx() == false) {

    } else if (sound != Sounds.none) {
        currentSound = sound.ordinal();

        view.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                try {
                    if (event.getAction() == MotionEvent.ACTION_DOWN)
                        pool.play(soundId[currentSound], 1.0f, 1.0f, 0, 0,
                                1);
                } finally {
                }
                return false;
            }
        });
    }
}

public boolean initialize(Activity activity) {

    if (initialized == false) {
        player = new MediaPlayer();
        pool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
        assetManager = activity.getAssets();
        activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);

        for (int idx = 1; idx < Sounds.values().length; idx++)
            soundId[idx] = loadSound(
                    String.format("%s.mp3", Sounds.values()[idx]),
                    assetManager);

        initialized = true;
    } else
        Log.w("SoundManager", "SoundManager was already initialized");

    return initialized;
}

public boolean isInitialized() {
    return initialized;
}

private int loadSound(String filename, AssetManager assetManager) {
    int rc;
    AssetFileDescriptor afd;

    try {
        afd = assetManager.openFd(filename);
        rc = pool.load(afd, 1);
    } catch (IOException e) {
        e.printStackTrace();
        rc = 0;
    }

    return rc;
}

public boolean playMusic(String filename) {
    boolean rc = false;
    AssetFileDescriptor descriptor;

    if (initialized == false)
        Log.e("SoundManager", "SoundManager is not initialized");
    else
        try {
            descriptor = assetManager.openFd(filename);
            player.reset();
            player.setDataSource(descriptor.getFileDescriptor(),
                    descriptor.getStartOffset(),
                    descriptor.getDeclaredLength());
            player.setLooping(true);
            // player.setVolume(1.0f, 1.0f);
            player.prepare();
            player.start();

            rc = true;
        } catch (Exception e) {
            e.printStackTrace();
        }

    return rc;
}

public void playSound(Sounds sound) {
    int index;

    index = sound.ordinal();
    soundStream[index] = pool.play(soundId[index], 1.0f, 1.0f, 0, 0, 1);
}

public void stopAllSound() {
    for (int idx = 1; idx < Sounds.values().length; idx++)
        stopSound(Sounds.values()[idx]);
}

public boolean stopMusic() {
    boolean rc = false;

    if (initialized == false)
        Log.e("SoundManager", "SoundManager is not initialized");
    else {
        player.stop();
        rc = true;
    }

    return rc;
}

public void stopSound(Sounds sound) {
    int index;

    index = sound.ordinal();
    pool.stop(soundStream[index]);
}

}

于 2012-12-04T23:07:14.173 に答える