libgdx音量逐渐停止,解决音量调节崩溃crash闪退

一、 音量逐渐停止

在项目做到后期的时候,老板突然说: bgm切换的时候,突然就停止,太突兀了,体验非常糟糕,能不能逐渐停止?

当时,我就想拿起我柜子里面的阳江十八子40米西瓜刀,往老板身上砍。
libgdx音量逐渐停止,解决音量调节崩溃crash闪退_第1张图片
但是,理性告诉我,不能冲动,于是我就先找了一下libgdx里面有没有提供逐渐停止这样子的方法,于是打开了Music接口,发现就几个方法。。。。。这就真的是 哎呀妈呀脑瓜疼 脑瓜疼

在我百思不得其解的时候,突然 屎意袭来,在厕所发挥得淋漓尽致的时候,灵光一闪,想到了渐停的原理就是音量逐渐变成0,而且这是一个过程,那我自己用定时的方法,轮询把音量逐渐设置为0不就行了吗,马上屁股都不擦就跑回工作岗位,就是把代码一顿撸,最终代码如下:

    private var mNextMusic: String? = null
    private var mISConverMusic: Boolean = false 
    /**
     * 背景音乐2s内渐变到停止
     */
    fun setBackgroundMusic(bgmfile: String?) {

        if (mISConverMusic) {
            mNextMusic = bgmfile
            return
        } else {
            mNextMusic = null
        }

        if (mBgmMusic == null || ReadGameActivity.isQuickMode()) {
            playBgmReal(bgmfile)
            return
        } else {

            if (mBgmMusic?.isPlaying() == true) {
                mISConverMusic = true
                //需要渐渐停止
                Observable.interval(0, 200, TimeUnit.MILLISECONDS)
                        .subscribeOn(Schedulers.io())
                        .take(10)
                        .observeOn(AndroidSchedulers.mainThread())
                        .doFinally {
                            mISConverMusic = false
                            mBgmMusic?.stop()
                            if (!TextUtils.isEmpty(mNextMusic)) {
                                setBackgroundMusic(mNextMusic)
                            } else {
                                //完成,播放新的
                                playBgmReal(bgmfile)
                            }
                        }
                        .subscribe({ num ->
                            var num = num + 1  //从1到10
                            mBgmMusic?.setVolume(mBgmMusicVolume * ((10 - num) / 10F))
                        })
            } else {
                playBgmReal(bgmfile)
            }
        }

    }

    private fun playBgmReal(bgmfile: String?) {
        mBgmMusic?.stop()
        if (TextUtils.isEmpty(bgmfile) || bgmfile == Contants.CLEAR) {
            //停止播放
            mBgmMusic = null
        } else {
            //循环播放
            var name = ReadFileUtils.getReadPathNoEx(mNovelID, false) + bgmfile
            if (AssetsUtil.instance.mAssetManager.isLoaded(name)) {
                try {
                    mBgmMusic = GdxMusic(AssetsUtil.instance.mAssetManager.get(name))
                    mBgmMusic?.setLooping(true)
                    mBgmMusic?.setVolume(mBgmMusicVolume)
                    mBgmMusic?.play()
                } catch (e: Exception) {
                    if (BuildConfig.LOG_DEBUG) {
                        ToastUtil.showLongToast("播放背景音乐失败!!!")
                    }
                    e.printStackTrace()
                }

            } else {
                Timber.e("播放bgm失败,还没加载${name}")
            }
        }
    }

主要是用到了Rxjava,利用interval,间隔200毫秒,发送10次,然后每次接收就把音量进行百分比减少,最后stop,如果有新的bgm就播放新的bgm。

二、在某些手机上发现Music都某些操作会崩溃?

新的一天,又是一个开心的日子,突然后台小哥,突然和我说:刚刚我操作的时候闪退了喔。

我就不乐意了,心生鄙视感:傻逼会不会用。 但是表面还是笑嘻嘻:给我复现一遍看看。
libgdx音量逐渐停止,解决音量调节崩溃crash闪退_第2张图片

直到我看着他操作,然后百分百闪退的时候,我淡定的说: 好的 ,我调试一下。

经过一顿高技术的调试之后,发现 ,在这个破手机上面,居然在音乐播放的时候,停止 就报了一个native的错误,经过多次尝试,百度,谷歌之后,发现这什么玩意,无解。。。于是,,那就换个角度去解决吧:

/**
 * 解决在某些机型上面报错的问题
 */
class GdxMusic(var music: Music) {


    fun setVolume(volume: Float) {
        try {
            music.volume = volume
        } catch (e: Exception) {
        }
    }

    fun stop() {
        try {
            music.stop()
        } catch (e: Exception) {
        }
    }

    fun play() {

        try {
            music.play()
        } catch (e: Exception) {
        }
    }

    fun isPlaying(): Boolean {

        try {
            return music.isPlaying
        } catch (e: Exception) {
        }
        return false
    }

    fun setLooping(looping: Boolean) {
        try {
            music.isLooping = looping
        } catch (e: Exception) {
        }

    }

}

写一个类,重写了Music一样的方法,然后里面调用music对应的方法,然后利用try去把错误都拦截了就ojbk了。

你可能感兴趣的:(libgdx音量,libgdx,music崩溃,音量逐渐停止,Libgdx)