程序设计小作业
MyElderlyApp:一款面向中老年用户的综合性 Android 应用
摘要
本文介绍了一个名为 MyElderlyApp 的 Android 应用,面向中老年用户,集成了健康管理、快捷出行、文艺社区及多款休闲小游戏(五子棋、中国象棋、围棋、麻将)。文章从项目定位、技术选型、核心功能、实现关键点等方面进行详尽阐述,并附上完整的 Kotlin 源码供读者参考。
目录
项目背景与定位
随着智能手机在中老年人群中的普及,如何设计一款 界面简洁、易操作 且功能实用的移动应用成为开发者关注的重点。“MyElderlyApp” 项目正是针对这一需求而诞生,目标是打造一款集出行、健康和娱乐于一体的“一站式” Android 应用,具体定位如下:
目标用户:中老年用户,他们对应用的易用性、字体大小、色彩对比有较高要求,同时更注重健康管理、便捷服务以及休闲娱乐。
核心目标:
- 快捷出行:一键打车或查询公交,流程简单直观。
- 健康管理:包括挂号、咨询、用药提醒等模块,让中老年用户快速获取医疗/健康服务入口。
- 文艺社区:提供一个轻松氛围的社区入口,配合 Lottie 动效,吸引用户参与。
- 休闲小游戏:内置 五子棋、中国象棋、围棋、麻将 四款经典棋类游戏,满足用户娱乐需求。
技术栈与架构概览
语言 & 框架
- Kotlin + Jetpack Compose(Material 3)
- AndroidX Navigation Compose
- Lottie for Compose(动效展示)
- Canvas & 自定义 View
认证 & 导航
- 使用 Firebase Authentication(邮箱/密码)实现简单的用户注册与登录
- 采用单 Activity + 多 Composable 方案,通过
NavHost管理各个界面路由
文件结构(核心)
1
2
3
4
5
6
7
8
9
10├── MainActivity.kt # Application 启动 Activity,负责 NavHost 注册
├── LoginScreen.kt # 登录 / 注册界面
├── MainScreenImproved.kt # 登录后主界面(底部导航 + 功能入口网格)
├── QuickTravelScreen.kt # 快捷出行模块
├── HealthScreen.kt # 健康管理模块
├── ArtCommunityScreen.kt # 文艺社区页面(宫格 + 动效 + 游戏入口)
├── GomokuScreen.kt # 五子棋
├── ChessScreen.kt # 中国象棋
├── GoGameScreen.kt # 围棋
└── MahjongScreen.kt # 麻将主题 & 配色
- 使用 Material 3 默认主题,主色调以暖色系为主,兼顾中老年用户视觉习惯
- 文艺社区模块使用中国风配色:米色背景 + 大红为主色,配以金黄色祥云动效
核心功能模块介绍
登录与主界面
登录界面(LoginScreen.kt)
- 支持注册 / 登录切换
- 邮箱格式校验、密码长度限制
- 登录成功后,通过
navController.navigate("main") { popUpTo("login") inclusive=true }保证登录页从返回栈中弹出 - 若网络状况差,则显示提示
主界面(MainScreenImproved.kt)
- 顶部渐变横幅 + 底部四个页签:快捷出行、健康管理、文艺社区、个人中心(可根据需求扩展)
- 文艺社区页签下使用
LazyVerticalGrid以圆形卡片展示小游戏入口:五子棋、象棋、围棋、麻将
快捷出行 (QuickTravelScreen)
功能描述
- 提供 滴滴打车 和 公交查询 按钮。
- 点击“打车”按钮,通过 Android 原生 Intent 调用 URI Scheme
didi://;若检测到用户未安装滴滴,则跳转到应用商店。 - 点击“公交查询”按钮,直接跳转到指定的公交查询网页。
- 界面所有按钮文字较大,配色简洁,适合中老年人视力习惯。
健康管理 (HealthScreen)
功能描述
- 三个大按钮:一键挂号、在线咨询、用药提醒
- 按钮占满整行宽度,文字居中,背景色采用暖色系。
- 目前为占位跳转(
navController.navigate("...")),后续可接真实后端接口(如医院挂号 API、在线问诊服务、WorkManager 定时提醒等)。
文艺社区 (ArtCommunityScreen)
功能描述
- 主页采用卡片式宫格布局,每个卡片代表一个休闲小游戏入口(五子棋、象棋、围棋、麻将)。
- 卡片内嵌 Lottie 动效,吸引用户点击。
- 整体配色以米色为底、卡片边缘大红描边,符合中国传统审美,并兼顾中老年人视觉舒适度。
五子棋 (GomokuScreen)
界面与交互
- 使用 Compose Canvas 自绘 15×15 棋盘。
- 通过
remember { mutableStateListOf<Point>() }存储落子坐标列表,根据当前玩家(黑 / 白)交替渲染黑白棋子。 - 每次玩家落子后,调用胜负判定函数判断是否有人获胜,并在 Canvas 上方文案提示 “黑方获胜” / “白方获胜”。
- 随机从 30 句棋局格言中挑选一句置于棋盘上方。
中国象棋 (ChessScreen)
界面与交互
由于象棋对路线、棋子形态要求更复杂,采用 Android 原生
View(Canvas)嵌入到 Compose:1
2
3
4AndroidView(
factory = { context -> ChessBoardView(context) },
modifier = Modifier.fillMaxSize()
)棋盘绘制:9×10 格阵,每个格子等宽,
drawLine画线;“楚河汉界”文字通过drawText标注。棋子布局与规则判定:支持马脚、象眼、炮打隔子、将帅见面等规则,完整判断每一步是否合法。
右上角提供“重置”按钮,清空棋局、重置初始阵型。
围棋 (GoGameScreen)
界面与交互
- 同样使用 Compose
Canvas自绘 19×19 格线。 - 通过
mutableStateListOf<Point>()记录黑白棋子在网格交叉点的位置。 - 提供“悔棋”功能:维护
moveHistory,每次悔棋从列表末尾移除一子,并触发 UI 重绘。 - 简单 Ko 劫判定:对上一次吃子与当前落子位置进行对比,禁止同一形状重复循环。
- 提供“提子”逻辑:当一方围死对方无气时,移除对应棋子。
- 同样使用 Compose
麻将 (MahjongScreen)
界面与交互
限制为 4 人简化版麻将,强制横屏:通过 Compose 的
DisposableEffect与LocalView强制将 Activity 设置为SCREEN_ORIENTATION_LANDSCAPE。牌面使用 Emoji 字符串渲染,例如 “🀐” 代表某张牌。
布局:
- 玩家手牌在最下方,横排展示。
- 左右两家手牌竖排展示,牌背朝用户。
- 上家手牌横排倒置展示。
- 中央区域为当前出牌区与操作按钮,包括“碰”“杠”“胡”等操作(仅模拟展示,未接入完整胡牌算法)。
UI 保持紧凑:手牌大小、位置经过多次调试,保证不需要滑动即可完整展示所有牌。
实现关键点解析
单 Activity + Compose 多路由
在
MainActivity.kt中创建NavHost:1
2
3
4
5
6
7
8
9
10
11
12
13setContent {
MyElderlyTheme {
NavHost(
navController = navController,
startDestination = "login"
) {
composable("login") { LoginScreen(navController) }
composable("main") { MainScreenImproved(navController) }
composable("quick_travel") { QuickTravelScreen(navController) }
// … 其他路由 …
}
}
}
状态保存与 UI 通信
- 对于游戏模块,大量使用
remember { mutableStateOf(...) }、remember { mutableStateListOf(...) }等方式管理状态 - Compose 会自动根据 State 变化触发重组(Recompose),无需手动调用
invalidate()
- 对于游戏模块,大量使用
Canvas 自绘 vs AndroidView 嵌入原生 View
五子棋、围棋 直接用 Compose Canvas,代码更简洁;示例:
1
2
3
4
5
6
7
8
9
10
11
12
13Canvas(modifier = Modifier.fillMaxSize()) {
val width = size.width / 15f
for (i in 0..15) {
drawLine(color = Color.Black, start = Offset(i * width, 0f), end = Offset(i * width, size.height))
drawLine(color = Color.Black, start = Offset(0f, i * width), end = Offset(size.width, i * width))
}
// 渲染棋子
stonePositions.forEach { (pt, isBlack) ->
drawCircle(color = if (isBlack) Color.Black else Color.White,
radius = width * 0.4f,
center = Offset(pt.x * width, pt.y * width))
}
}中国象棋 由于判定逻辑更复杂,优先考虑性能与灵活性,用自定义
View(继承自View并重写onDraw())绘制。再通过AndroidView嵌入 Compose。
屏幕方向强制与资源管理(麻将模块)
在 MahjongScreen.kt 中:
1
2
3
4
5DisposableEffect(Unit) {
val activity = (LocalView.current.context as Activity)
activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
onDispose { activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR }
}
动效集成
- 使用
LottieAnimation(composition, iterations = LottieConstants.IterateForever, ...)加载 JSON 动效文件(存放在assets目录下),示例见ArtCommunityScreen.kt。
- 使用
Firebase Auth 初步接入(登录模块)
- 在
LoginScreen.kt内部,通过Firebase.auth.createUserWithEmailAndPassword(...)或signInWithEmailAndPassword(...)完成注册/登录逻辑,错误时直接在界面底部以Toast提示。
- 在
项目源码(Markdown 格式)
下面直接贴出每个 .kt 文件的完整内容,供您在博客中引用。所有代码均已按 Kotlin 语法高亮用三重反引号标注。
LoginScreen.kt
1 | package com.example.myelderlyapp |
MainActivity.kt
1 | package com.example.myelderlyapp |
QuickTravelScreen.kt
1 | package com.example.myelderlyapp |
HealthScreen.kt
1 | package com.example.myelderlyapp |
ArtCommunityScreen.kt
1 | package com.example.myelderlyapp |
GomokuScreen.kt
1 | package com.example.myelderlyapp |
ChessScreen.kt
1 | package com.example.myelderlyapp |
GoGameScreen.kt
1 | package com.example.myelderlyapp |
MahjongScreen.kt
1 | package com.example.myelderlyapp |
可改进与未来展望
数据持久化
- 当前所有游戏与用户操作均为内存状态,应用重启后会丢失。
- 后续可引入 Room Database,将用户对局、健康记录、用药提醒等持久化到本地。
AI 对弈
- 为五子棋、象棋、围棋编写简单 AI,可以采用 Minimax、Alpha-Beta 剪枝、Monte-Carlo Tree Search 等算法,实现单机对战。
健康模块与第三方服务对接
- 集成真实医院挂号 API(如国家、省市医院统一挂号平台)、在线问诊接口。
- 用 WorkManager 做本地用药提醒,结合 Room 数据库存储提醒记录,并支持前台通知。
无障碍与中老年优化
- 支持动态字体:在
MaterialTheme中允许用户根据系统字体大小自动缩放 - 添加 TalkBack 描述:为按钮、Image、Canvas 等 UI 元素添加无障碍标签
- 增加高对比度模式切换,以便色盲 / 视力低下用户使用
- 支持动态字体:在
UI/代码复用
- 将常见的圆形按钮、卡片组件提炼为
ElderlyButton、FeatureCard等可复用组件 - 每个游戏模块的重置、悔棋、胜利提示等逻辑可统一抽象出基类函数
- 将常见的圆形按钮、卡片组件提炼为
版本与测试覆盖
- 使用 Compose UI Test 编写界面测试,验证登录流程、导航正确性、游戏胜负判定等关键逻辑
- 使用 JUnit 5 完成单元测试,针对
checkWin()、棋子合法落子函数等核心算法做充分验证
结语
“MyElderlyApp” 项目旨在为中老年用户提供一个简单易用、功能全面的移动应用示例,从登录认证到多模块集成,从页面布局到自定义 Canvas、从 Firebase Auth 到后续可扩展的 Room 数据库,涵盖了完整的移动端开发流程。
项目收获:
- 深入理解 Jetpack Compose 多路由导航与状态管理;
- 掌握 Canvas 自绘与原生 View 嵌入的区别与实践;
- 熟悉 Firebase Auth 使用与 Compose 配合;
- 提升了面向中老年群体的 UI/UX 设计思路。
未来挑战:
- 如何在保证中老年用户可用性的前提下,继续丰富功能模块(如健康数据可视化、AI 对弈);
- 如何在实际产品中做到线上线下数据同步,提供更完善的健康与服务生态;
- 如何持续维护与测试,保证项目质量,并根据用户反馈不断迭代。
希望本文及附带完整源码对您在移动端开发、游戏逻辑实现及中老年应用设计方面有所帮助。欢迎在评论区讨论、给出建议或指出问题。祝您开发顺利!
下载链接
- 项目完整代码(GitHub 仓库)
- 如果需要进一步集成 Firebase、Room 等,可参考仓库中的
README.md进行配置。