基于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 {
声音播放器.释放资源()
}
}
}