编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

安卓摇骰子app源码_安卓摇骰子app源码在哪

wxchong 2025-09-13 10:57:15 开源技术 3 ℃ 0 评论

基于kotlin \ jetpack compose语言开发

音效播放:

class 播放器(val context: Context){
    //创建声音池,设置最大同时播放流数为1
    private val 声音池 = SoundPool.Builder().setMaxStreams(1).build()
    private var soundId = 0 // 存储加载的音频资源ID
    private var streamId = 0  // 存储当前播放实例的流ID,用于控制播放/停止

    // 初始化块,在类实例化时执行
    init {
        // 加载raw资源文件夹中的音频文件,优先级设为1
        soundId = 声音池.load(context, R.raw.shaizi, 1)
    }

    fun 播放骰子声音() {
        // 播放音频:soundId=音频资源, 1.0f左右声道音量, 1.0f右声道音量,
        // 1=优先级, -1=循环播放(-1表示无限循环), 1.0f=播放速率
        streamId=声音池.play(soundId, 1.0f, 1.0f, 1, -1, 1.0f)
    }

    fun 停止播放() {
        // 使用之前保存的streamId停止播放
        声音池.stop(streamId)
    }
    // 释放声音池占用的所有资源
    fun 释放资源() {
        声音池.release()
    }
}

UI界面设计:

@Composable
fun 按钮(name: String,onClick:()->Unit,fontWeight: FontWeight = FontWeight.Normal){
    OutlinedButton(onClick = onClick) {
        Text(text = name,fontWeight = fontWeight,)
    }
}

@Composable
fun App(){
    val context = LocalContext.current
    val 声音播放器 =remember { 播放器(context) }  // 创建播放器实例
    // 获取协程作用域,用于启动协程
    val scope = rememberCoroutineScope()
    var 是否正在滚动 by remember { mutableStateOf(false) } // 添加滚动状态
// 存储当前正在运行的协程任务,用
    var 显示几个骰子 by remember{ mutableStateOf(3) }
    var 第一个骰子随机数 by remember { mutableStateOf(1) }
    var 第二个骰子随机数 by remember { mutableStateOf(1) }
    var 第三个骰子随机数 by remember { mutableStateOf(1) }
    val 随机显示图片1 = when(第一个骰子随机数){
        1 -> ImageBitmap.imageResource(R.drawable.shaizi1)
        2 -> ImageBitmap.imageResource(R.drawable.shaizi2)
        3 -> ImageBitmap.imageResource(R.drawable.shaizi3)
        4 -> ImageBitmap.imageResource(R.drawable.shaizi4)
        5 -> ImageBitmap.imageResource(R.drawable.shaizi5)
        else -> ImageBitmap.imageResource(R.drawable.shaizi6)
    }
    val 随机显示图片2 = when(第二个骰子随机数){
        1 -> ImageBitmap.imageResource(R.drawable.shaizi1)
        2 -> ImageBitmap.imageResource(R.drawable.shaizi2)
        3 -> ImageBitmap.imageResource(R.drawable.shaizi3)
        4 -> ImageBitmap.imageResource(R.drawable.shaizi4)
        5 -> ImageBitmap.imageResource(R.drawable.shaizi5)
        else -> ImageBitmap.imageResource(R.drawable.shaizi6)
    }
    val 随机显示图片3 = when(第三个骰子随机数){
        1 -> ImageBitmap.imageResource(R.drawable.shaizi1)
        2 -> ImageBitmap.imageResource(R.drawable.shaizi2)
        3 -> ImageBitmap.imageResource(R.drawable.shaizi3)
        4 -> ImageBitmap.imageResource(R.drawable.shaizi4)
        5 -> ImageBitmap.imageResource(R.drawable.shaizi5)
        else -> ImageBitmap.imageResource(R.drawable.shaizi6)
    }

    Column(modifier = Modifier.padding(top=50.dp)) {
        Row(Modifier.fillMaxWidth().padding(bottom = 20.dp),horizontalArrangement = Arrangement.Center) {
            Text("掷骰子")
        }
        Row(Modifier.fillMaxWidth(),horizontalArrangement= Arrangement.SpaceEvenly) {
            按钮("1个", onClick={显示几个骰子=1}, if(显示几个骰子==1)FontWeight.Black else FontWeight.Normal)
            按钮("2个", onClick={显示几个骰子=2},if(显示几个骰子==2)FontWeight.Black else FontWeight.Normal)
            按钮("3个", onClick={显示几个骰子=3},if(显示几个骰子==3)FontWeight.Black else FontWeight.Normal)
        }
        Canvas(Modifier.aspectRatio(16f/5f).background(color = Color.White)) {
            //筛子宽高
            val 宽 = size.width/4f
            //第一个筛子左上角坐标
            val x =  size.width/2-宽/2
            val y = size.height/2 - 宽/2
            if(显示几个骰子==3){
                drawImage(
                    image = 随机显示图片3,
                    dstOffset = IntOffset(x.toInt(),y.toInt()),
                    dstSize = IntSize(宽.toInt(),宽.toInt())
                )

                drawImage(
                    image = 随机显示图片2,
                    dstOffset = IntOffset(x.toInt()+宽.toInt(),y.toInt()),
                    dstSize = IntSize(宽.toInt(),宽.toInt())
                )
                drawImage(
                    image =随机显示图片1,
                    dstOffset = IntOffset(x.toInt()-宽.toInt(),y.toInt()),
                    dstSize = IntSize(宽.toInt(),宽.toInt())
                )
            }else if(显示几个骰子==2){
                drawImage(
                    image = 随机显示图片1,
                    dstOffset = IntOffset(x.toInt()+宽.toInt(),y.toInt()),
                    dstSize = IntSize(宽.toInt(),宽.toInt())
                )
                drawImage(
                    image =随机显示图片2,
                    dstOffset = IntOffset(x.toInt()-宽.toInt(),y.toInt()),
                    dstSize = IntSize(宽.toInt(),宽.toInt())
                )
            }else{
                drawImage(
                    image =随机显示图片1,
                    dstOffset = IntOffset(x.toInt(),y.toInt()),
                    dstSize = IntSize(宽.toInt(),宽.toInt())
                )
            }
        }
        Row(Modifier.fillMaxWidth(),horizontalArrangement = Arrangement.Center) {
            按钮(if(是否正在滚动) "停止" else "开始", onClick={
                是否正在滚动 = !是否正在滚动  // 切换滚动状态
                if(是否正在滚动){
                    声音播放器.播放骰子声音()
                    scope.launch{
                        while (是否正在滚动){
                            第一个骰子随机数=Random.nextInt(1, 7)
                            第二个骰子随机数=Random.nextInt(1, 7)
                            第三个骰子随机数=Random.nextInt(1, 7)
                            delay(100) // 每100毫秒更新一次
                        }
                    }
                }else{
                    声音播放器.停止播放()
                }
            },
           FontWeight.Normal)
        }

    }
    //释放资源
    DisposableEffect(Unit) {
        onDispose {
            声音播放器.释放资源()
        }
    }
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表