2012-12-04 81 views
0

我有兩個按鈕,如果按下它們會發出聲音。我想同時按兩個鍵同時聽到兩個聲音。到目前爲止:使用兩個按鈕的多點觸控問題:即使按兩個不同的按鈕時也總是得到相同的按鈕,爲什麼?

@覆蓋 //處理導航箭頭 公共布爾onTouch(視圖V,MotionEvent事件){

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也可以工作。對不起,這個愚蠢的問題我非常喜歡這個領域的初學者。

UPDATE

有了這個代碼,它檢測到的多點觸控,但我得到了總有兩個相同的日誌,如果我感動總是相同的按鈕與兩個我的手指。所以,即使我同時按下兩個按鈕,我會得到一個日誌「C」和另一個「C」,這是錯誤的,我應該得到C和D.

感謝您的提前!

回答

0

你在玩SurfaceView嗎?我感覺不是。你爲什麼不簡單地設置每個Button的OnClickListener?

否則,你需要單獨訪問每個觸摸事件:看到一段「指數與ID」在http://android-developers.blogspot.be/2010/06/making-sense-of-multitouch.html:也許它會幫助你

塞爾

+0

不,我不使用surfaceview,我應該?爲什麼會更好?如果我只是爲每個按鈕設置onClickListener,它仍然不會工作。 – erdomester

+0

我檢查了我製作的遊戲的源代碼,並確實使用了onTouchListener。如果你處理了這個事件,也許你應該返回True而不是假? –

+0

沒有改變:S仍然播放它首先檢測到的聲音。 –

0

請問您的代碼看起來象?我突出了一些關鍵點

package 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;

public class DummyActivity extends Activity實現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;

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。媒體播放器; import android.media.SoundPool; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener;

public class SoundManager2 {0}私有靜態SoundManager2當前=新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]); 
} 

}

+0

是的,在這種情況下,根本沒有多點觸控。 –

+0

我可以向你保證有多點觸控:這就是我如何構建我的遊戲Finger Twister(最多10個聯繫點) –

+0

更新了我的代碼。試圖登錄多點觸控,但沒有任何反應,只有第一個按鈕給我一個日誌。 –

相關問題