我确实在网上到处搜寻,发现很少 澄清如何做到这一点。 差不多,我有一个在array.xml文件中布置的8个声音文件和我 需要播放随机选择的文件ONCE per或onClick或onShake。 首先,我应该使用什么技术来实现这一目标? ARRAY-> RANDOM-
方向将有助于我大约3周的价值 研究这个。与字符串>玩?随机INT->播放?随机INT-> STRING->播放?任何一种
*注意: 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;
}
}
答案 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();
这对我有用