PartyDice

🚀 我的第一款酒局神器App“摇了么”诞生记!

源代码、安装包及效果图在文章结尾处。

一直想做一个既好玩又实用的东西。终于,在AI的帮助下,我的第一款 Android 独立应用——“摇了么”,正式诞生啦!

这是一款专为酒局、聚会打造的摇骰子小工具。虽然市面上有很多类似的小程序,但作为一个强迫症+体验控,决定亲自操刀,给它注入真正的“灵魂”。

🎲 为什么叫“摇了么”?

在酒桌上,最常听到的一句话可能就是“该你了,摇了么?”。这个名字既是对朋友的催促,也是这款 App 核心交互的体现——别点屏幕了,直接拿起手机摇吧!

✨ 核心亮点:把细节死磕到底

在体验上主要有以下亮点:

  • 告别反人类UI,单手掌控全局: 抛弃了早期版本中需要呼出软键盘来输入骰子数量的繁琐设计。利用线性布局(LinearLayout)的权重属性,将核心视觉区(骰子展示)固定在中上方,而在底部手指出没的最舒适区域,加入了丝滑的 -+ 按钮。1到15个骰子,单手一秒切换。
  • 注入灵魂的“物理外挂”(摇一摇): 酒局游戏,怎么能只用手指点按钮呢?调用了 Android 的底层硬件——加速度传感器 (Accelerometer)。通过计算 X、Y、Z 三个维度的综合重力加速度,只要你像握着真实骰盅一样用力甩动手机,代码就会自动捕捉你的动作并触发掷骰子!
  • 沉浸式的声感与触觉反馈: 为了模拟真实的物理反馈,加入了双重感官刺激:
    1. 听觉:接入 MediaPlayer,摇晃时伴随清脆的“哗啦哗啦”骰子碰撞声。
    2. 触觉:调用 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()

💡 写在最后

如果你也想体验一下这款小工具,或者对源码感兴趣,欢迎讨论与交流!

home.jpg

版权声明: 如无特别声明,本文版权归 Yucol 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:《 我的第一款酒局神器App“摇了么” 》

本文链接:https://yucol.top/app/PartyDice.html

本文最后一次更新为 天前,文章中的某些内容可能已过时!