前言
本文介绍如何使用 Kotlin 语言和 Android 属性动画技术,快速开发一款包含基础、进阶与困难三个难度的糖果捕捉小游戏。文章将重点解析动态视图生成、屏幕坐标随机分布以及基于相似三角形的平移距离计算原理。
环境准备
开发本游戏需要以下基础环境:
- Android Studio 最新版
- Kotlin 语言支持
- Gradle 构建工具
- 目标设备或模拟器(API Level 21+)
在 build.gradle 中确保已添加必要的依赖,虽然本示例主要使用原生 View 系统,但建议引入 Material Design 组件以提升 UI 体验。
成果展示
游戏包含三个难度版本,核心玩法均为点击屏幕收集掉落的糖果:
- 基础版:糖果仅在屏幕最上方生成,垂直向下掉落。
- 进阶版:糖果在屏幕中间生成,向四周发散移动。
- 困难版:糖果从屏幕四个角随机生成,向对角方向发散。
基础版效果
(图:基础版糖果垂直下落示意)
进阶版效果
(图:进阶版糖果向四周发散示意)
困难版效果
(图:困难版糖果从四角生成示意)
实现细节
引导动画及基础版的糖果生成逻辑较为简单,此处不再赘述。本节重点讲解进阶版与困难版的核心算法与代码实现。
进阶版实现原理
进阶版的核心在于让糖果从中心点向四周随机位置移动并移出屏幕。具体步骤如下:
- 动态创建 View:在运行时动态生成一个 TextView 作为糖果容器。
- 居中定位:利用 ConstraintLayout 的约束属性将其初始位置设为屏幕正中心。
- 随机坐标生成:获取屏幕宽高,生成随机偏移量。
- 属性动画播放:使用 ObjectAnimator 将 View 平移至屏幕外。
动态视图创建
TextView(this).apply {
// 1. 设置为居中显示
layoutParams = ConstraintLayout.LayoutParams(tvWidth, tvHeight).apply {
bottomToBottom = ConstraintSet.PARENT_ID
topToTop = ConstraintSet.PARENT_ID
startToStart = ConstraintSet.PARENT_ID
endToEnd = ConstraintSet.PARENT_ID
}
// 2. 设置糖果背景图片
background = ContextCompat.getDrawable(this@AdvancedActivity, generateRandomCandy())
// 3. 添加到根布局
viewBinding.root.addView(this)
}
上述代码通过 ConstraintLayout.LayoutParams 实现了绝对居中的布局效果。tvWidth 和 tvHeight 为预设的糖果尺寸常量。
随机坐标计算
为了模拟自然散落的效果,我们需要在屏幕范围内生成随机坐标。这里封装了两个辅助函数:
): {
(leftRange..rightRange).random()
}
): {
(leftRange..rightRange).random()
}


