带有声音的图像按钮无法正常工作 [英] Imagebutton with sound is not working
问题描述
我在android studio中制作了一个有10个imagebutton的程序,单击每个imagebutton都会产生声音.但是,当我在模拟器上运行它们时,只有前7个imagebutton会产生声音(不在乎我单击的按钮的顺序).我对此很陌生,请帮助我,这是我的代码:
i made a program in android studio which has 10 imagebutton, each imagebutton when clicked will produce a sound. However, when i run them on emulator only first 7 imagebutton will produce a sound (don't care what order the button i clicked on). Im new to this, help me, This is my code:
public class playtimang extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_playtimang);
final MediaPlayer satukecik = MediaPlayer.create(this, R.raw.one_kecik);
final MediaPlayer satubesar = MediaPlayer.create(this, R.raw.one_besar);
final MediaPlayer duakecik = MediaPlayer.create(this, R.raw.two_kecik);
final MediaPlayer duabesar = MediaPlayer.create(this, R.raw.two_besar);
final MediaPlayer tigakecik = MediaPlayer.create(this, R.raw.three_kecik);
final MediaPlayer tigabesar = MediaPlayer.create(this, R.raw.three_besar);
final MediaPlayer limakecik = MediaPlayer.create(this, R.raw.five_kecik);
final MediaPlayer limabesar = MediaPlayer.create(this, R.raw.five_besar);
final MediaPlayer enamkecik = MediaPlayer.create(this, R.raw.six_kecik);
final MediaPlayer enambesar = MediaPlayer.create(this, R.raw.six_besar);
ImageButton satu_kecikIB = (ImageButton) this.findViewById(R.id.satukecikIB);
ImageButton satu_besarIB = (ImageButton) this.findViewById(R.id.satubesarIB);
ImageButton dua_kecikIB = (ImageButton) this.findViewById(R.id.duakecikIB);
ImageButton dua_besarIB = (ImageButton) this.findViewById(R.id.duabesarIB);
ImageButton tiga_kecikIB = (ImageButton) this.findViewById(R.id.tigakecikIB);
ImageButton tiga_besarIB = (ImageButton) this.findViewById(R.id.tigabesarIB);
ImageButton lima_kecikIB = (ImageButton) this.findViewById(R.id.limakecikIB);
ImageButton lima_besarIB = (ImageButton) this.findViewById(R.id.limabesarIB);
ImageButton enam_kecikIB = (ImageButton) this.findViewById(R.id.enamkecikIB);
ImageButton enam_besarIB = (ImageButton) this.findViewById(R.id.enambesarIB);
satu_kecikIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
satukecik.start();
}
});
satu_besarIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
satubesar.start();
}
});
dua_kecikIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
duakecik.start();
}
});
dua_besarIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
duabesar.start();
}
});
tiga_kecikIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tigakecik.start();
}
});
tiga_besarIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tigabesar.start();
}
});
lima_kecikIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
limakecik.start();
}
});
lima_besarIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
limabesar.start();
}
});
enam_kecikIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
enamkecik.start();
}
});
enam_besarIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
enambesar.start();
}
});
}
}
推荐答案
由于MediaPlayer
是为某些长期运行的或较大的媒体文件(包括各种格式的视频,音频)制作的,因此不好用它来作一些小调因为它本身包含要执行的大量计算.要使用MediaPlayer
,有一个架构图.好吧,您应该使用SoundPool
,因为它仅用于此类目的.
As MediaPlayer
is made for some long running or big media files which includes various formats of Videos, audios so making use of it for some small tones is bad because it itself includes big calculations to perform. There is a architecture diagram to follow to make use of MediaPlayer
well instead you should use SoundPool
because it is designed for such purposes only.
现在,您问题的主要答案是
Now the main answer to your problem is
如官方文档所述
创建"已在API级别1中添加
"Create" Added in API level 1
MediaPlayer创建(上下文上下文,int resid)
MediaPlayer create (Context context, int resid)
为给定资源ID创建MediaPlayer的便捷方法.成功后,将已经调用prepare(),并且不能再次调用.使用MediaPlayer完成后,应调用release()释放资源.如果未发布,那么太多的MediaPlayer实例将导致异常.请注意,由于在此方法中会自动调用prepare(),因此您无法更改新MediaPlayer.
Convenience method to create a MediaPlayer for a given resource id. On success, prepare() will already have been called and must not be called again.When done with the MediaPlayer, you should call release(), to free the resources. If not released, too many MediaPlayer instances will result in an exception. Note that since prepare() is called automatically in this method, you cannot change the audio stream type (see setAudioStreamType(int)), audio session ID (see setAudioSessionId(int)) or audio attributes (see setAudioAttributes(AudioAttributes) of the new MediaPlayer.
简而言之,您必须遵循MediaPlayer
的状态图,以确保免受此类错误或异常的影响.您必须在每次调用后调用release方法来释放资源.
In short you must follow the state diagram of MediaPlayer
to get safety from such kind of errors or exceptions. You must call release method to release the resources after every call.
这篇关于带有声音的图像按钮无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!