从onClick和onShake事件中随机生成声音?

时间:2010-05-11 03:19:10

标签: android arrays audio random

我确实在网上到处搜寻,发现很少 澄清如何做到这一点。 差不多,我有一个在array.xml文件中布置的8个声音文件和我 需要播放随机选择的文件ONCE per或onClick或onShake。 首先,我应该使用什么技术来实现这一目标? ARRAY-> RANDOM-

  

与字符串>玩?随机INT->播放?随机INT-> STRING->播放?任何一种

方向将有助于我大约3周的价值 研究这个。

*注意:              MediaPlayer mp = MediaPlayer.create(JelloMan.this,                      R.raw.sound) ... ...我坚持认为你不能用字符串替换“R.raw”部分......

以下是整个代码。

package com.cyphasignals.jelloman;

import java.util.Random;

import android.app.Activity;
import android.hardware.SensorManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;

public class JelloMan extends Activity {
/** Called when the activity is first created. */

   @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);        

    private final int NUM_SOUND_FILES = 3;
    //Modifier invalid here 
    private int mfile[] = new mfile[NUM_SOUND_FILES];
    //Modifier invalid here and SECOND "mfile" is wanting to create a class
    private Random rnd = new Random(3);
    //Modifier invalid here 
        mfile[0] = R.raw.sound1;
        mfile[1] = R.raw.sound2;
        mfile[2] = R.raw.sound3;
    int sndToPlay = rnd.nextInt(NUM_SOUND_FILES);

   ShakeListener MyShake = new ShakeListener((SensorManager) 
getSystemService(SENSOR_SERVICE)); 
    MyShake.setForceThreshHold(4.0); 
    MyShake.setOnShakeListener(new ShakeListener.OnShakeListener() {

        MediaPlayer mp = MediaPlayer.create(JelloMan.this, mfile[sndToPlay]);
        //[sndToPlay] wants me to change the modifier
         public void onShake() {
             mp.seekTo(0);
             mp.start();                 
         } 
    });
    ImageButton mouthbutton = (ImageButton)findViewById(R.id.billmouth);
    mouthbutton.setOnClickListener(new OnClickListener() {

        MediaPlayer mp = MediaPlayer.create(JelloMan.this, 
                mfile[sndToPlay]);
            //[sndToPlay] wants me to change the modifier
        public void onClick(View v) {
            mp.seekTo(0);
            mp.start(); 
            }
    });

} 
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {

    if (keyCode == KeyEvent.KEYCODE_BACK) {
        finish();
        return true;
    };
    return false;
}

}

3 个答案:

答案 0 :(得分:2)

在半假代码中:

private final int NUM_SOUND_FILES = 3;

private int mSndFiles[] = new int[NUM_SOUND_FILES];
private Random rnd = new Random();   //import java.util.Random for this

mSndFiles[0] = R.raw.sound1;
mSndFiles[1] = R.raw.sound2;
mSndFiles[2] = R.raw.sound3;

int sndToPlay = rnd.nextInt(NUM_SOUND_FILES);

MediaPlayer mp = MediaPlayer.create(JelloMan.this, mSndFiles[sndToPlay]);

如果您拥有的所有声音文件都很小并且您想要低延迟,请考虑使用SoundPool而不是MediaPlayer。

编辑:我并不是故意要将上面的代码复制并粘贴到您的应用中,我认为您可以将内容放在正确的位置。无论如何,试试这个,请注意我在代码中的评论。我没有对此进行测试,并假设您还在其他地方定义了“ShakeListener”类,但这应该可行。

package com.cyphasignals.jelloman;

import java.util.Random;
import android.app.Activity;
import android.hardware.SensorManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;

import com.cyphasignals.R;

public class JelloMan extends Activity {

    private final int NUM_SOUND_FILES = 3;  //*****REPLACE THIS WITH THE ACTUAL NUMBER OF SOUND FILES YOU HAVE*****

    private int mfile[] = new int[NUM_SOUND_FILES];
    private Random rnd = new Random();
    private MediaPlayer mp;

   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        

        mfile[0] = R.raw.sound1;  //****REPLACE THESE WITH THE PROPER NAMES OF YOUR SOUND FILES
        mfile[1] = R.raw.sound2;  //PLACE THE SOUND FILES IN THE /res/raw/ FOLDER IN YOUR PROJECT*****
        mfile[2] = R.raw.sound3;

       ShakeListener MyShake = new ShakeListener((SensorManager.getSystemService(SENSOR_SERVICE)); 
       MyShake.setForceThreshHold(4.0); 
       MyShake.setOnShakeListener(new ShakeListener.OnShakeListener() {
          public void onShake() {
             mp = MediaPlayer.create(JelloMan.this, mfile[rnd.nextInt(NUM_SOUND_FILES)]);
             mp.seekTo(0);
             mp.start();                 
       }});

       ImageButton mouthbutton = (ImageButton)findViewById(R.id.billmouth);
       mouthbutton.setOnClickListener(new OnClickListener() {
          public void onClick(View v) {
             mp = MediaPlayer.create(JelloMan.this, mfile[rnd.nextInt(NUM_SOUND_FILES)]);
             mp.seekTo(0);
             mp.start(); 
       }});

   } 
   @Override
   public boolean onKeyDown(int keyCode, KeyEvent event)  {
      if (keyCode == KeyEvent.KEYCODE_BACK) {
         finish();
         return true;
      }
   return false;
   }
}

从结构上讲,如果有人不断摇动设备,你需要考虑如何工作。就像现在一样,它会不断跳回到声音的开头。

答案 1 :(得分:1)

好吧......基于我对你的问题所理解的......

R.raw.sound是整数,所以当然,你不能用字符串值替换它。 为什么不创建一个int数组并将每个声音文件放入其中... 如下......

file [0] = R.raw.sound_0 file [1] = R.raw.sound_1  :  :  : file [n] = R.raw.sound_n

现在,您所要做的就是获得0到n之间的随机值....

MediaPlayer mp = MediaPlayer.create(JelloMan.this,file [random_value]);

答案 2 :(得分:1)

存储这样的声音:

    private static final int[] SOUNDS = new int[] {
    R.drawable.abort,  R.drawable.aliens, R.drawable.annoying, R.drawable.better, 
    R.drawable.birth_control, R.drawable.bitchin, R.drawable.book_em, R.drawable.clean_up, 
    R.drawable.come_on, R.drawable.cry, R.drawable.damn_it, R.drawable.damn, R.drawable.game_over,
    R.drawable.good, R.drawable.gotta_hurt, R.drawable.hail, R.drawable.holy_cow, R.drawable.holy_sh,
    R.drawable.let_god, R.drawable.name, R.drawable.play, R.drawable.terminated,
    R.drawable.this_sux, R.drawable.ugly, R.drawable.wasted, R.drawable.you_suck,
    R.drawable.you_suck2, R.drawable.you_will_die
};

你可以玩它:

 int sndToPlay = rnd.nextInt(SOUNDS.length);
           MediaPlayer mp = MediaPlayer.create(main.this, SOUNDS[sndToPlay] );
         mp.seekTo(0);
         mp.start();  

这对我有用