带有两个按钮的多点触控问题:即使按下两个不同的按钮,总是会得到相同的按钮,为什么?

时间:2012-12-04 21:32:50

标签: android button multi-touch

我有两个按钮,如果按下它们会发出声音。我想同时按下两个声音同时听到这两个声音。到目前为止:

@覆盖       //处理导航箭头的触摸     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;
}

它不起作用。我该怎么解决这个问题?如果我在屏幕上移动手指的另一个问题我想在我的手指到达按钮时按下按钮而不抬起它。 ACTION_MOVE也可以。对不起这个愚蠢的问题,我在这个领域非常初学。

更新

使用此代码可以检测到多点触控,但我总是有两个相同的日志,好像我用两个手指触摸了相同的按钮。因此,即使我同时按下两个按钮,我得到一个日志“C”和另一个“C”错误,我应该得到C和D.

感谢您提前!

2 个答案:

答案 0 :(得分:0)

你在玩SurfaceView吗?我感觉不是。你为什么不简单地设置每个Button的OnClickListener?

否则,您需要单独访问每个触摸事件:请参阅http://android-developers.blogspot.be/2010/06/making-sense-of-multitouch.html处的“索引与ID”段落:也许它会对您有所帮助

塞尔

答案 1 :(得分:0)

你的代码看起来像这样吗?我强调了一些关键点

包be.domore.smokesignaltest;

import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.Button;

公共类DummyActivity扩展Activity实现OnTouchListener {     私人按钮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;

import be.domore.FingerTwister.Settings;

import android.app.Activity; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.SoundPool; import android.util.Log; import android.view.MotionEvent; import android.view.View; import 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]);
}

}