Android 两个按钮的多点触摸问题:即使我按下两个不同的按钮,也总是得到相同的按钮,为什么?

Android 两个按钮的多点触摸问题:即使我按下两个不同的按钮,也总是得到相同的按钮,为什么?,android,button,multi-touch,Android,Button,Multi Touch,我有两个按钮,按下会发出声音。我想同时按两个声音同时听到这两个声音。到目前为止: @凌驾 //处理导航箭头的触摸 公共布尔onTouch(视图v,运动事件){ 它不起作用。我该如何解决这个问题?另一个问题如果我在屏幕上移动手指,我想在手指触到按钮时按下按钮而不抬起它。移动操作也不起作用。很抱歉,这个愚蠢的问题我在这方面是相当初学者 更新 这个代码检测多点触摸,但我总是得到两个相同的日志,就像我总是用两个手指触摸同一个按钮一样。所以,即使我同时按下这两个按钮,我也会得到一个日志“C”和另一个错误的

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

@凌驾 //处理导航箭头的触摸 公共布尔onTouch(视图v,运动事件){

它不起作用。我该如何解决这个问题?另一个问题如果我在屏幕上移动手指,我想在手指触到按钮时按下按钮而不抬起它。移动操作也不起作用。很抱歉,这个愚蠢的问题我在这方面是相当初学者

更新

这个代码检测多点触摸,但我总是得到两个相同的日志,就像我总是用两个手指触摸同一个按钮一样。所以,即使我同时按下这两个按钮,我也会得到一个日志“C”和另一个错误的“C”,我应该得到C和D


谢谢你的帮助!

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

否则,您需要单独访问每个触摸事件:请参阅:处的“索引与ID”一段,也许它会对您有所帮助


Serge你的代码是这样的吗?我强调了一些要点

包be.domore.smokesignaltest

导入android.app.Activity; 导入android.os.Bundle; 导入android.view.MotionEvent; 导入android.view.view; 导入android.view.view.OnTouchListener; 导入android.widget.Button

公共类DummyActivity扩展了活动实现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

导入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

公共类声音管理器2{ 私有静态SoundManager2当前=新SoundManager2()

publicstaticsoundmanager2getcurrent(){
回流;
}
私有布尔初始化=false;
私人媒体播放器;
私人音乐池;
私人资产管理人资产管理人;
私有int[]soundId=newint[Sounds.values().length];
私有int[]soundStream=newint[Sounds.values().length];
私有SoundManager2(){
}
公共声音视图(视图、声音、声音){
最终声音;
if(Settings.hasFx()==false){
}else if(sound!=Sounds.none){
currentSound=sound.ordinal();
view.setOnTouchListener(新的OnTouchListener(){
公共布尔onTouch(视图v,运动事件){
试一试{
if(event.getAction()==MotionEvent.ACTION\u向下)
pool.play(soundId[currentSound],1.0f,1.0f,0,0,
1);
}最后{
}
返回false;
}
});
}
}
公共布尔初始化(活动){
如果(初始化==false){
player=新媒体播放器();
池=新的声音池(20,AudioManager.STREAM_MUSIC,0);
assetManager=activity.getAssets();
activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
for(int idx=1;idx

}

不,我不使用surfaceview,是吗?为什么会更好?如果我只是为每个按钮设置onClickListener,它仍然不起作用。我检查了我制作的游戏的源代码,事实上我与OnTouch合作过
@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;*
}
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]);
}