2012-11-04 58 views
1

因此,我正在爲Android製作木琴應用程序,並且遇到了問題,我不確定如何正確使用onTouch。現在我可以按下圖像並播放聲音,但我不能一次播放兩種聲音,也不能將手指向下滑動並彈奏所有聲音,它只會播放按下的第一個圖像。我知道這是因爲onTouch和Multitouch,但我不知道如何做到這一點,我找不到任何相關的示例代碼,任何幫助表示讚賞!帶有多點觸控和SoundPool Motion事件的onTouch

這是我的主要活動

public class Xylophone extends Activity { 
private Player mSoundManager; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_xylophone); 
    mSoundManager = new Player(); 
    mSoundManager.initSounds(getBaseContext()); 
    mSoundManager.addSound(1, R.raw.note01); 
    mSoundManager.addSound(2, R.raw.note02); 
    mSoundManager.addSound(3, R.raw.note03); 
    mSoundManager.addSound(4, R.raw.note04); 
    mSoundManager.addSound(5, R.raw.note05); 
    mSoundManager.addSound(6, R.raw.note06); 
    mSoundManager.addSound(7, R.raw.note07); 
    mSoundManager.addSound(8, R.raw.note08); 

    ImageView img01 = (ImageView) findViewById(R.id.imageView1); 
    img01.setOnTouchListener(new OnTouchListener() {  

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      mSoundManager.playSound(1); 
      return false; 
     }   
    }); 

    ImageView img02 = (ImageView) findViewById(R.id.imageView2); 
    img02.setOnTouchListener(new OnTouchListener() {  

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      mSoundManager.playSound(2); 
      return false; 
     }   
    }); 

這是我的Soundpool活動

public class Player { 

private SoundPool mSoundPool; 
private HashMap<Integer, Integer> mSoundPoolMap; 
private AudioManager mAudioManager; 
private Context mContext; 


public Player() 
{ 

} 

public void initSounds(Context theContext) { 
    mContext = theContext; 
    mSoundPool = new SoundPool(8, AudioManager.STREAM_MUSIC, 0); 
    mSoundPoolMap = new HashMap<Integer, Integer>(); 
    mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);   
} 

public void addSound(int Index,int SoundID) 
{ 
    mSoundPoolMap.put(Index, mSoundPool.load(mContext, SoundID, 1)); 
} 

public void playSound(int index) { 

    int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
    mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f); 
} 

public void playLoopedSound(int index) { 

    int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
    mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, 1f); 
} 

}

這是我的佈局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_centerVertical="true" 
    android:orientation="horizontal" > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:adjustViewBounds="true" 
     android:cropToPadding="false" 
     android:scaleType="fitXY" 
     android:src="@drawable/button01" /> 

    <ImageView 
     android:id="@+id/imageView2" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:scaleType="fitXY" 
     android:src="@drawable/button02" /> 
+0

我真的可以用在正確的方向上推在這裏,我試圖對運動賽事讀了http://developer.android.com/參考/ android /視圖/ MotionEvent.html但我只是沒有抓住它,任何人? – bliynd

回答

1

希望你想通了unti我現在。還有這是我的注意事項: 首先你的第二堂課,SoundPool,是而不是一個活動。

你必須嘗試的不是重寫每個按鈕的onTouch方法。


相反,在您的主要活動中,使其實現OnTouchListener。

當然,您需要實現/重寫OnTouchListener的方法。所以現在,如果你註冊你的主視圖和/或每個按鈕(看你自己的作品!)到OnTouchListener,你會得到所有的觸摸(多點觸摸)。

看一看在MotionEvent類詳情

public class Xylophone extends Activity implements onTouchLister{ 
    public static final String TAG = "Xylophone"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     /*Either have your parent view register THIS (Xylophone) as its listener, or have each button register THIS(Xylophone) as its listener.*/ 
     yourParentView.setOnTouchListener(this); 
     //or 
     img02.setOnTouchListener(this); 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     Log.i(TAG, "ID:" + Integer.toString(v.getId())); 
     Log.i(TAG, "Pointer count: " + event.getPointerCount());   
     Log.i(TAG, "Action: " + event.getActionMasked()); 
     Log.i(TAG, "Action index: " + event.getActionIndex()); 
    }