微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有 ImageView 用法的 SoundPool 与 Switch 类似

如何解决具有 ImageView 用法的 SoundPool 与 Switch 类似

我在编写应用程序时卡住了,我找不到解决该问题的任何来源。

问题:我想使用图像视图作为开关。当我点击 imageView 时,我想启动我的 SoundPool.Player,如果我再次点击 imageView 那么它应该停止。

当我点击 imageView 时我可以开始声音,但我无法停止。

class PlayerPool() {

lateinit var poolPlayer : SoundPool
var playerId : Int = 0

companion object {

    const val pageTag = "PlayerPool"
    var instance: PlayerPool? = null

    fun getInstance(context:Context): PlayerPool? {
        if(instance == null)
            instance = PlayerPool()
        return instance
    }

}

fun poolStarter(ctx : Context,position: Int){

    poolPlayer = SoundPool.Builder().setMaxStreams(10).build()
    val poolSounds = poolPlayer.load(ctx,position,1)

    poolPlayer.setonLoadCompleteListener { soundPool,sampleId,status ->

        playerId = poolPlayer.play(poolSounds,0.1f,1,1f)

    }

}

fun poolPausePlayer(){

        poolPlayer.stop(playerId)

}

}

class MixFragmentAdapter(
val mixList: ArrayList<SoundModel>,val mixListener:RowClickListener<SoundModel>
) : BaseRecyclerAdapter<SoundModel,RowFragmentMixBinding>() {

override val layoutRes: Int
    get() = R.layout.row_fragment_mix
override val arrayList: ArrayList<SoundModel>
    get() = mixList

override fun bindView(
    binding: RowFragmentMixBinding,currentData: SoundModel,position: Int
) {

    binding.ivMixCardImages.setimageResource(mixList[position].soundImage)
    binding.root.setonClickListener {

        mixListener.onClick(position,item = mixList[position])

        binding.switchMusicControl.setonCheckedchangelistener { buttonView,isChecked ->

            if (isChecked){

                PlayerPool.getInstance(binding.ivMixCardImages.context)!!.poolStarter(binding.ivMixCardImages.context,position)

            }
            else{

                PlayerPool.getInstance(binding.ivMixCardImages.context)!!.poolPausePlayer()

            }


        }


    }
}

}

<androidx.cardview.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="6dp"
    app:cardCornerRadius="20dp"
    app:cardBackgroundColor="#7E57C2"
    app:cardElevation="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/tvMixSounds" >
    
    <androidx.constraintlayout.widget.ConstraintLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/ivMixCardImages"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:padding="10dp"
            android:backgroundTint="@android:color/white"
            app:layout_constraintDimensionRatio="1:1"
            app:layout_constraintBottom_toTopOf="@+id/tvCardinformation"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/tvMixCardinformation"
            app:layout_constraintTop_toTopOf="parent"
            android:src="@drawable/ic_fire" />


        <TextView
            android:id="@+id/tvMixCardinformation"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:textSize="16sp"
            android:textStyle="bold"
            android:gravity="center"
            android:visibility="gone"
            android:text="Ateş!"
            app:layout_constraintTop_toBottomOf="@id/ivMixCardImages"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />

        <Switch
            android:id="@+id/switchMusicControl"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>

解决方法

对于第一次使用 soundpool 的人来说,这是一个常见问题。如果您仔细查看 soundpool 的文档,播放使用参​​数“soundID”,而停止使用参数“streamID”。很容易忽略这一点,并像您的代码一样使用从 load 函数返回的 soundID 用于两个命令。我什至看到 android 教程示例弄错了。而是使用这些命令:

s1 = sound.load(Main.this,R.raw.mosq1,1);  
if (l1==true){p1=sound.play(s1,1,rep,1);     
sound.stop(p1);

必须确保 p1 是正确的。

关于您的代码:

    fun poolStarter(ctx : Context,position: Int){
    ....
    poolPlayer.setOnLoadCompleteListener { soundPool,sampleId,status ->

        playerId = poolPlayer.play(poolSounds,0.1f,1f)

    }}

    fun poolPausePlayer(){
            poolPlayer.stop(playerId)
    }

使用时,必须保证 playerId 相同。

尝试更改 MixFragmentAdapter 中的代码:

    lateinit var p:PlayerPool
    override fun bindView(
        binding: RowFragmentMixBinding,currentData: SoundModel,position: Int
    ) {

        var context = binding.ivMixCardImages.context
        p =PlayerPool.getInstance(context)!!
        binding.ivMixCardImages.setImageResource(mixList[position].soundImage)
        binding.root.setOnClickListener {
            mixListener.onClick(position,item = mixList[position])
            binding.switchMusicControl.setOnCheckedChangeListener { buttonView,isChecked ->
                if (isChecked){
                    p.poolStarter(context,position )
                }
                else{
                    p.poolPausePlayer()
                }
            }

        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。