PartyDice
🚀 我的第一款酒局神器App“摇了么”诞生记!
源代码、安装包及效果图在文章结尾处。
一直想做一个既好玩又实用的东西。终于,在AI的帮助下,我的第一款 Android 独立应用——“摇了么”,正式诞生啦!
这是一款专为酒局、聚会打造的摇骰子小工具。虽然市面上有很多类似的小程序,但作为一个强迫症+体验控,决定亲自操刀,给它注入真正的“灵魂”。
🎲 为什么叫“摇了么”?
在酒桌上,最常听到的一句话可能就是“该你了,摇了么?”。这个名字既是对朋友的催促,也是这款 App 核心交互的体现——别点屏幕了,直接拿起手机摇吧!
✨ 核心亮点:把细节死磕到底
在体验上主要有以下亮点:
-
告别反人类UI,单手掌控全局:
抛弃了早期版本中需要呼出软键盘来输入骰子数量的繁琐设计。利用线性布局(LinearLayout)的权重属性,将核心视觉区(骰子展示)固定在中上方,而在底部手指出没的最舒适区域,加入了丝滑的
-和+按钮。1到15个骰子,单手一秒切换。 - 注入灵魂的“物理外挂”(摇一摇): 酒局游戏,怎么能只用手指点按钮呢?调用了 Android 的底层硬件——加速度传感器 (Accelerometer)。通过计算 X、Y、Z 三个维度的综合重力加速度,只要你像握着真实骰盅一样用力甩动手机,代码就会自动捕捉你的动作并触发掷骰子!
-
沉浸式的声感与触觉反馈:
为了模拟真实的物理反馈,加入了双重感官刺激:
-
听觉:接入
MediaPlayer,摇晃时伴随清脆的“哗啦哗啦”骰子碰撞声。 -
触觉:调用
Vibrator震动马达。在骰子滚动的 1 秒内,配合动画发出极其高频的轻微震动,停住的瞬间来一次重震。闭上眼睛,你手里握着的仿佛就是个真骰盅!
-
听觉:接入
- 安全纯净无广告: 代码完全开源,没有任何联网和收集隐私信息的行为;界面干净整洁,没有任何广告及干扰信息!
💻 核心代码 (Show Me The Code)
这里分享一下“摇了么”最核心的两个逻辑实现:
1. 如何让手机听懂“摇晃”?(传感器逻辑)
这里用到了初中的物理和数学知识 。手机的加速度传感器会实时返回 X、Y、Z 三个轴的受力。们算出它们除以地球重力加速度后的 G 力,然后利用勾股定理 算出综合受力:
// 传感器检测到手机运动时自动调用
override fun onSensorChanged(event: SensorEvent?) {
if (event != null && !isRolling) {
val x = event.values[0]
val y = event.values[1]
val z = event.values[2]
// 计算加速度,除以地球重力加速度得出 G 力
val gX = x / SensorManager.GRAVITY_EARTH
val gY = y / SensorManager.GRAVITY_EARTH
val gZ = z / SensorManager.GRAVITY_EARTH
// 勾股定理计算综合受力大小
val gForce = sqrt((gX * gX + gY * gY + gZ * gZ).toDouble()).toFloat()
// 阈值设定为 2.7:大约是用力甩一下手机的力度
if (gForce > 2.7f) {
val now = System.currentTimeMillis()
// 设置 1 秒的冷却防抖时间
if (now - lastShakeTime > 1000) {
lastShakeTime = now
// 模拟用户点击了摇骰子按钮
findViewById<Button>(R.id.btnRoll).performClick()
}
}
}
}
2. 如何实现逼真的“骰子翻滚”与触觉反馈?
为了不让结果显得太突兀,利用安卓自带的 CountDownTimer 写了一个 1 秒钟的动画循环。在这 1 秒内,不仅疯狂切换图片、随机倾斜角度,还同步调用了震动马达:
// 开始摇骰子动画(持续1000毫秒,每100毫秒刷新一次)
object : CountDownTimer(1000, 100) {
override fun onTick(millisUntilFinished: Long) {
for (view in diceViews) {
// 随机切图并赋予 -30 到 30 度的随机倾斜角
view.setImageResource(diceImages[Random.nextInt(6)])
view.rotation = Random.nextInt(-30, 30).toFloat()
}
// 摇晃过程中:触发 20 毫秒的极轻微震动(模拟骰子撞击杯壁)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
vibrator.vibrate(VibrationEffect.createOneShot(20, VibrationEffect.DEFAULT_AMPLITUDE))
} else {
vibrator.vibrate(20)
}
}
override fun onFinish() {
for (view in diceViews) {
// 定格最终点数,并将角度摆正
view.setImageResource(diceImages[Random.nextInt(6)])
view.rotation = 0f
}
// 摇晃结束:触发 100 毫秒的重震(模拟落桌定音)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
vibrator.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE))
} else {
vibrator.vibrate(100)
}
isRolling = false
}
}.start()
💡 写在最后
如果你也想体验一下这款小工具,或者对源码感兴趣,欢迎讨论与交流!
- 项目地址:https://github.com/JMbaozi/PartyDice
- 安装包地址:摇了么 v1.0

版权声明: 如无特别声明,本文版权归 Yucol 所有,转载请注明本文链接。
(采用 CC BY-NC-SA 4.0 许可协议进行授权)
本文标题:《 我的第一款酒局神器App“摇了么” 》
本文链接:https://yucol.top/app/PartyDice.html
本文最后一次更新为 天前,文章中的某些内容可能已过时!