当前位置: 首页 > news >正文

20212416 2023-2024-2 《移动平台开发与实践》综合实践

移动平台开放综合实践

  • 1.实验内容
  • 2.实验过程
    • 2.1 确定基础功能
    • 2.2 设计UI界面
    • 2.3 编写程序运行代码
    • 2.4 在基本功能的基础上丰富功能
  • 3. 代码分析
    • 3.1设置按钮的点击事件监听器
    • 3.2 比分更新模块
    • 3.3 比分存储模块
  • 4. 运行结果
  • 5.实践中遇到的问题及解决
  • 6.学习感悟与思考
  • 参考资料

1.实验内容

  • 因为我是排球场常客,打比赛时记分常常会出现这样一些问题,微信小程序方便但是疯狂弹广告,稍不留神就跳转拼多多淘宝;想连着记几局却要求你看一个28秒的广告,又一个52秒的广告,越看越长。用纸质记分牌吧,损耗严重,据已知数据,蓝队的0、1、9分的分值纸已经摇摇欲坠,红队的"2"更是不知所踪,奈何经费紧张,队服都得省吃俭用买别说频繁地添置新的纸质记分牌了。所以,借着这次机会,俺老宁挺身而出,自己设计了一款简单的记分app。

2.实验过程

2.1 确定基础功能

  • 我希望这个app首先具有“记分”这一基本功能;其次,要实现复用,还得能够重置比赛的分数;最后,如果点错了(给队伍加错分了),还需要有撤销的功能。

2.2 设计UI界面

  • 根据上述功能,能够确定下来的有“加分”按钮,“撤销”按钮,“重置”按钮,还需要有用来显示两队分数的分数板块。
  • 为了更美观也更符合主题一些,我们还可以找一张好看的背景图,再调整一下透明度。
  • 最后效果如下:
    在这里插入图片描述

2.3 编写程序运行代码

  • 代码其实主要分为三个模块,一个是设置按钮的点击事件监听器,一个是比分更新模块,还有就是比分存储模块。详见下面的代码分析。

2.4 在基本功能的基础上丰富功能

  • 我的设想是增加一个图表,能够根据实时得分情况更新,从而能直观地看到两支队伍在什么时间得分,或者说在哪个阶段集中得分,从而反映比赛场上的分数走势以及队员的状态变化等。
  • 但是我遇到了一个问题,图表是实时更新的,也就是说我每点击一次加分按钮,图表都要全部更新一次,那我之前的数据点如何体现在新的图表中?存储在什么地方能够保证它能够一直保存呢?
  • 这个我一直没有找到好的解决办法,导致做出来的图表会在更新分数后被新的分数覆盖,所以现在的代码里没有这个功能,如果找到了好的解决办法我就回来删掉这段话。

3. 代码分析

3.1设置按钮的点击事件监听器

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);redTeamScoreTextView = findViewById(R.id.red_team_score);blueTeamScoreTextView = findViewById(R.id.blue_team_score);redTeamButton = findViewById(R.id.red_team_button);blueTeamButton = findViewById(R.id.blue_team_button);resetButton = findViewById(R.id.reset_button);redTeamUndoButton = findViewById(R.id.red_team_undo_button);blueTeamUndoButton = findViewById(R.id.blue_team_undo_button);sharedPreferences = getSharedPreferences("ScorePreferences", Context.MODE_PRIVATE);redTeamScore = sharedPreferences.getInt("redTeamScore", 0);blueTeamScore = sharedPreferences.getInt("blueTeamScore", 0);updateScores();redTeamButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {redTeamScore++;updateScores();saveScores();}});blueTeamButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {blueTeamScore++;updateScores();saveScores();}});resetButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {redTeamScore = 0;blueTeamScore = 0;updateScores();saveScores();}});redTeamUndoButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (redTeamScore > 0) {redTeamScore--;updateScores();saveScores();}}});blueTeamUndoButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (blueTeamScore > 0) {blueTeamScore--;updateScores();saveScores();}}});
}

3.2 比分更新模块

private void updateScores() {redTeamScoreTextView.setText(String.valueOf(redTeamScore));blueTeamScoreTextView.setText(String.valueOf(blueTeamScore));
}

3.3 比分存储模块

private void saveScores() {SharedPreferences.Editor editor = sharedPreferences.edit();editor.putInt("redTeamScore", redTeamScore);editor.putInt("blueTeamScore", blueTeamScore);editor.apply();
}

4. 运行结果

排球比赛记分牌

5.实践中遇到的问题及解决

  • 问题1:图表如何实现
  • 问题1解决方案:仅靠java代码实现可能做出来的界面不会太漂亮,我们选择导入MPAndroidChart库
  • 问题2:无法通过设置dependencies线上下载GitHub上的MPAndroidChart库,总是会报语法错,但是语法我都让gpt检查过了是没问题的,可能是我的AS不支持这样添加依赖的方法。
  • 问题2解决方案:呕心沥血寻找MPAndroidChart库的jar包

6.学习感悟与思考

  • 这次综合实践其实让我有些挫败,因为一开始就是奔着做一个自己感兴趣的软件开始的,基本功能的实现很简单。而附加的实时化图表功能,捣鼓了很久都没弄出来,加上紧张的期末,真让人胸中郁结。我的主要精力都花在怎么实现附加功能,最后却没个结果,竹篮打水一场空,真挺叫人难过的。不过好在基础功能实现了,以后排球队都要记住我的名字哈哈。

参考资料

MPAndroidChart下载和添加依赖

相关文章:

  • 秋招突击——6/19——复习{(单调队列优化)——最大子序列和,背包问题——宠物小精灵收服问题}——新作{两两交换链表中的节点}
  • xshell使用vi命令:bash:vim:command not found
  • 全能AI客户端:ChatGPT Web Midjourney Proxy,AI绘画+GPT4o对话
  • http和https的区别在哪
  • Java基础 - 练习(四)打印九九乘法表
  • 【TensorFlow深度学习】量化压缩技术在降低模型体积中的应用
  • PHP XML: 解析、生成与操作指南
  • 面试专区|【70道Hive高频题整理(附答案背诵版)】
  • 【Golang - 90天从新手到大师】Day06 - 数组
  • Freemaker 模板
  • 机器学习补充
  • python离线安装第三方库、及其依赖库(单个安装,非批量移植)
  • 基于esp-idf的arm2d移植
  • 计算机编码以及URL转码
  • C语言王国——深入自定义类型(联合体、枚举)
  • [译]CSS 居中(Center)方法大合集
  • ES6简单总结(搭配简单的讲解和小案例)
  • Fabric架构演变之路
  • HTTP 简介
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PAT A1017 优先队列
  • PHP变量
  • supervisor 永不挂掉的进程 安装以及使用
  • vue脚手架vue-cli
  • 将 Measurements 和 Units 应用到物理学
  • 浏览器缓存机制分析
  • 前端自动化解决方案
  • 首页查询功能的一次实现过程
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • - 转 Ext2.0 form使用实例
  • Nginx实现动静分离
  • 数据库巡检项
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​configparser --- 配置文件解析器​
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​水经微图Web1.5.0版即将上线
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #Linux(帮助手册)
  • #nginx配置案例
  • #pragma预处理命令
  • #宝哥教你#查看jquery绑定的事件函数
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (第二周)效能测试
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一) storm的集群安装与配置
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET CLR基本术语