2014-02-28 37 views
0

我是Android新手,我遇到了一些問題。我試圖製作一個應用程序,它有三個按鈕,可以播放不同的短音。我希望聲音不會互相重疊,所以當我按下一個按鈕時,另一個聲音會停止。這是我的代碼。Android中的多個聲音按鈕:通過按鈕啓動,停止和循環聲音

<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" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".MainActivity" > 

<Button 
    android:id="@+id/button2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/button1" 
    android:layout_below="@+id/button1" 
    android:layout_marginTop="42dp" 
    android:text="Button" /> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="91dp" 
    android:text="Button" /> 

<Button 
    android:id="@+id/button3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/button2" 
    android:layout_below="@+id/button2" 
    android:layout_marginTop="48dp" 
    android:text="Button" /> 

</RelativeLayout> 

package com.example.soundbutton; 

import java.io.IOException; 

import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.View; 
import android.widget.Button; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     final MediaPlayer s1 = MediaPlayer.create(this, R.raw.trumpet); 
     final MediaPlayer s2 = MediaPlayer.create(this, R.raw.sy04); 
     final MediaPlayer s3 = MediaPlayer.create(this, R.raw.machine); 

     Button b1 = (Button) findViewById(R.id.button1); 

     b1.setOnClickListener(new Button.OnClickListener() { 
     @Override 
      public void onClick(View v) { 
       s2.stop(); 
       s3.stop(); 

       try { 
        s1.prepare(); 
        s1.seekTo(0); 
        s1.start(); 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 
     }); 

     Button b2 = (Button) findViewById(R.id.button2); 

     b2.setOnClickListener(new Button.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       s1.stop(); 
       s3.stop(); 

       try { 
        s2.prepare(); 
        s2.seekTo(0); 
        s2.start(); 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 
     }); 

     Button b3 = (Button) findViewById(R.id.button3); 

     b3.setOnClickListener(new Button.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       s2.stop(); 
       s1.stop(); 

       try { 
        s3.prepare(); 
        s3.seekTo(0); 
        s3.start(); 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 
     }); 

    } 

    } 

我已經在這裏搜索了很多,並且類似問題的答案還沒有爲我工作。到目前爲止,該應用程序不會播放我按下的第一個按鈕,但可以讓您播放其他按鈕。點擊幾下後,所有按鈕都可以抓住工作。我聽說SoundPool是短暫聲音的理想選擇,但我無法找到任何我想要做的示例代碼。無論如何,我知道必須有一個解決方案,我很抱歉,如果這是一個微不足道的問題。我也很感謝如何循環每個按鈕的聲音,並仍然有來自每個按鈕的聲音不重疊。感謝任何和所有的幫助。

回答

0

你不知道停止其他MediaPlayer對象,如果他們連打: 這一部分:

s2.stop(); 
s3.stop(); 

你必須在一個包這些如果循環確保你阻止他們之前他們在玩。

if(s2.isPlaying() || s2.isLooping()) { 
    s2.stop(); 
    } 
if(s3.isPlaying() || s3.isLooping()) { 
    s3.stop(); 
    } 

在其他情況下相應改變。也看看這個文檔here。它表示當使用MediaPlayer.create創建MediaPlayer對象時,它將已經調用prepare()調用,因此在開始之前不需要再次調用prepare()

+0

我編輯了我的代碼。我刪除了並準備調用IO異常,並嘗試/捕獲。所以現在看起來如果(s2.isPlaying()|| s2.isLooping()){s2.stop(); (s3.isPlaying()|| s3.isLooping()){ s3.stop(); s1.start(); } 現在所有的按鈕都會播放聲音,但是當點擊一個按鈕時,它會停止另一個按鈕的聲音。上一個按鈕在再次點擊後不會播放。 – user3362828