网站首页 > 开源技术 正文
基于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 {
声音播放器.释放资源()
}
}
}
猜你喜欢
- 2025-09-13 基于yolo v4的自动化标注软件实现——附源码
- 2025-09-13 医院临床信息系统源码_临床信息系统的定义
- 2025-09-13 民宿小程序源码,开启民宿新模式!
- 2025-09-13 MAC电脑WPS如何接入deepseek,附源码,全网最简单的接入教程
- 2025-09-13 源代码以500美元的价格出售,Zeppelin勒索软件可能重新面世
- 2025-09-13 直播带货app源码搭建中,直播CDN的原理是什么?
- 2025-09-13 直播平台源码开发搭建APP的DASH协议:流媒体技术其中一环
- 2025-09-13 Java开发的汽车俱乐部系统源码小程序app
- 2025-09-13 线下陪诊APP小程序源码开发,线下陪诊APP平台就只能陪诊吗?
- 2025-09-13 三个练手的软件测试实战项目(附全套视频跟源码)偷偷卷死他们
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)