带声音的图像按钮不起作用 [英] Imagebutton with sound is not working

查看:36
本文介绍了带声音的图像按钮不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 android studio 中做了一个程序,它有 10 个图像按钮,每个图像按钮在点击时都会产生声音.但是,当我在模拟器上运行它们时,只有前 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();
        }
    });


}

}

推荐答案

As 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(),因此您无法更改新的音频流类型(请参阅 setAudioStreamType(int))、音频会话 ID(请参阅 setAudioSessionId(int))或音频属性(请参阅 setAudioAttributes(AudioAttributes)).媒体播放器.

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆