.NET MAUI 开发电子木鱼(上)

本文介绍如何使用 .NET MAUI 开发一个电子木鱼应用。以实际的小应用开发为例,通过这个开发过程,介绍了其涉及的 .NET MAUI、Blazor、前端等相关知识点。文章涉及的应用已开源在 Github,大家可前往下载体验: https://github.com/sangyuxiaowu/MuYu

文章目录

  • 1. 背景
  • 2. 相关知识点
  • 3. 开发过程
    • 3.1 需求分析
    • 3.2 开发第一步
    • 3.3 核心功能
    • 3.4 动效设计
    • 3.5 菜单设计
    • 3.6 对话框
    • 3.7 数据存储
    • 3.8 Blazor 循环小 BUG
  • 4. 最后

1. 背景

电子木鱼不知道从什么时候火了起来,成了年轻人的新时尚。年轻人没有选择经常去寺庙像和尚那样念经,而是下载了电子木鱼软件,进行线上敲木鱼。虽然搞不懂这种“敲电子木鱼,见机甲佛祖,积赛博功德,修图灵真经”的赛博玄学,但是这个软件它做起来容易,需求还简单。在这么焦虑的假期生活中,还是假期的最后一天,最适合玩一玩 .NET MAUI 了。

请添加图片描述

2. 相关知识点

这个项目及文章使用并介绍了一下相关知识点:

  1. Blazor 播放音频,主要为 JS 调用
  2. Blazor 调用 .NET MAUI 各平台原生对话框
  3. .NET MAUI 的 Preferences 数据存储
  4. Blazor 循环渲染中的一个常见 BUG

界面 UI 方面因为使用还是 Web 的技术,所以更多的是前端的知识,可自行探索。

3. 开发过程

3.1 需求分析

这个电子木鱼整体功能非常简单,主要就是点击一下屏幕播放一下木鱼敲击的音频,这个是核心功能。

再往下设计,就是一些动效的优化,比如:

  1. 木鱼敲击的动效,放大
  2. 木鱼敲击的震动反馈,当然这一条可能没必要
  3. 木鱼敲击后的文字浮动,一敲“+999功德”这种的

更进一层的设计:

  1. 这里需要引入设置功能了,加入设置菜单
  2. 文字浮动内容的自定义
  3. 自动敲击积累功德
  4. 自定义的敲击音和木鱼样式,这里就要开始费美工了

再接下来迭代,当然也是有很多参考的相关案例,比如:

  1. 排行榜功能,区域排行,日,周,月各种排行榜单
  2. 分享功能,满足人们的分享欲
  3. 添加诵经背景音,使氛围更融洽

当然,以上只是瞎扯,作为一个清心寡欲的木鱼,做好自己定位是第一步。“天之道,不争而善胜”,作为佛系木鱼,当然只是纯粹的敲击,满足最基本的需求就可以了。

3.2 开发第一步

这个开发第一步,沿用我之前讲的那个《MAUI 安卓 UI 资源设置》文章的内容,先把 UI 资源处理一下。这次被老婆拒绝了,我亲自拿钢笔工具把这个木鱼 Logo 给绘制出来了,作为一个合格的全栈,美工也是需要会的。

请添加图片描述

这个 Logo 画完,内部应用的主体界面木鱼自然也就设计好了。

3.3 核心功能

电子木鱼的核心功能,当然是点击屏幕播放一下敲击音效了。因为我们使用的是 .NET MAUI Blazor ,为了后续界面动效的设计,我们通过前端的方式来播放音乐。

为了图方便,直接在 wwwroot/index.html HTML 入口文件中添加如下 audio 标签和 JS 方法:

<audio id="player"><source  src="other/muyu.wav" />
</audio>
<script>
window.PlayAudioFile = (tips) => {var audio = document.getElementById('player');audio.play();
}
</script>

在应用的首页添加图片点击的事件,来调用 JS,并预留了文字浮动内容的传递:

<img id="img" src="/images/muyu.svg" style="height:100%;max-width:100%" @onclick="ClickHandler" />
async Task ClickHandler()
{await JS.InvokeAsync<string>("PlayAudioFile", tipsInfo);
}

本小节相关知识点:《JavaScript 互操作》

3.4 动效设计

动效设计这里我们主要实现木鱼敲击放大动效和敲击后的文字浮动。这里主要是前端的技术,我们使用 CSS3 的 @keyframes 创建两个动画规则:

@keyframes showbig {0% {transform: scale(1);}50% {transform: scale(1.05);}
}@keyframes showtips {0% {opacity: 1;transform: translateY(0);}75% {opacity: .9;transform: translateY(-1.5em);}100% {opacity: 0;transform: translateY(-2em);}
}

这里两个动效都是默认是只循环一遍,时长 0.3s :

.showbig {animation-timing-function: ease-in-out;animation-duration: .3s;animation-name: showbig;
}

通过 JS 方式控制 DOM 的 Class 添加删除来实现动画的播放:

function ShowBig() {var img = document.getElementById('img');img.classList.add('showbig');setTimeout(() => {img.classList.remove('showbig');}, 300);
}

对于浮动的文字来说,快速敲击时,为了可以显示多条,这边的浮动文字是动态创建的 P 标签。还记得前面预留的 tipsInfo 吧,是在这里使用的。

function ShowTips(text) {var p = document.createElement("p");p.classList.add('tips');p.innerHTML = text;var tips = document.getElementById('tips');tips.appendChild(p);setTimeout(() => {tips.removeChild(p)}, 300);
}

3.5 菜单设计

有了设置当然就可以搞个菜单出来了,菜单这里的设计也非常简单,我们可以直接新建一个 Blazor 组件 Shared/SettingMenu.razor,来实现传递菜单项来生成菜单组件,并在点击选项后返回点击的菜单序号。

<div class="mask" style="display:@(Show?"flex":"none")"><div class="setting_menu"><div class="title">@MenuTitle</div><ul class="list">@for (int i=0;i<NavData.Count(); i++){<li @onclick="e=>MenuClick(i)">@NavData[i]</li>}</ul></div>
</div>
/// <summary>
/// 点击回调
/// </summary>
[Parameter]
public EventCallback<int> OnMenuClick { get; set; }/// <summary>
/// 菜单标题
/// </summary>
[Parameter]
public string MenuTitle { get; set; } = "设置";/// <summary>
/// 显示隐藏
/// </summary>
[Parameter]
public bool Show { get; set; } = false;/// <summary>
/// 菜单信息
/// </summary>
[Parameter]
public string[] NavData { get; set; }/// <summary>
/// 通知点击事件
/// </summary>
/// <param name="inx">点击的index</param>
/// <returns></returns>
async Task MenuClick(int inx)
{await OnMenuClick.InvokeAsync(inx);
}

那,跑一下看看,似乎,大概,也许是非常完美:

请添加图片描述

3.6 对话框

在我们的悬浮文字设置选项中,需要提供输入功能。当然,直接前端的方案,设计一个模态对话框似乎是一个非常好的方案,也符合 UI 的一致性。但是考虑到能省则省,这边没有使用前端的框架,所以再手写一个会稍微费点事的。如果说省事,当然是直接前端 JS 的 prompt ,但是这样又显得格格不入:

请添加图片描述

.NET MAUI Blazor 这种混合开发的模式大多都一样,对话框也是一个小问题。不过这里可以非常方便的使用本机对话框,只要拿到 Page 即可,在 razor 文件的 code 代码块中,我们可以这样用:

string result = await Application.Current.MainPage.DisplayPromptAsync("悬浮文字设置", "请设置敲击后的自定义悬浮文字", "确定", "取消", "请输入悬浮文字", 5, null, tipsInfo);

本小节相关知识点:《显示弹出窗口》

3.7 数据存储

搞定了设置文字的交互,接下来就是存储了,总体来说我们需要存储的木鱼的总敲击次数,今日敲击次数和刚刚的自定义悬浮文字。毕竟不是复杂的应用,就没必要上数据库了,对于这种简单的键值数据存储我们可以直接选用 PreferencesPreferences 通过调用 Preferences.Set 方法来设置,提供键和值,以下就是完整的设置悬浮文字和存储的方法:

/// <summary>
/// 获取初始的悬浮文字
/// </summary>
private string tipsInfo = Preferences.Default.Get("tips", "功德+1");async Task SetTips()
{string result = await Application.Current.MainPage.DisplayPromptAsync("悬浮文字设置", "请设置敲击后的自定义悬浮文字", "确定", "取消", "请输入悬浮文字", 5, null, tipsInfo);if (string.IsNullOrWhiteSpace(result)) return;Preferences.Default.Set("tips", result);tipsInfo = result;
}

本小节相关知识点:《Preferences》

3.8 Blazor 循环小 BUG

做的差不多了,菜单也有了,可以简单跑一下看看了,但是似乎菜单出了些问题,设置菜单的按钮并不好用,每一个回调都是 4:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ywko3Od-1675503302385)(./img/2.png)]

啊对,前面的完美,我是说界面。BUG 总会有的,还总是发生在不经意之间。

元芳你怎么看?

元芳:问一问 ChatGPT 吧,他说他懂这个的。

ChatGPT:是的,我了解Blazor。Blazor是一种用于开发Web应用程序的框架,允许使用C#代码和.NET运行时在浏览器中运行Web应用程序。它提供了一种方便的方法来使用.NET技术来构建客户端Web应用程序,而无需学习JavaScript。

仔细检查我们会发现,在前面的 SettingMenu.razor 菜单组件中,我们有一个循环,通过枚举NavData数组中的每一项并创建一个包含该项的列表项。因为需要序号,所以这里用的 for 循环,问题在于,在回调函数 MenuClick(i) 中,变量i是局部的,在循环结束后其值就改变了。

为了解决这个问题,可以将当前项的索引存储在闭包中:

<ul class="list">@for (int i = 0; i < NavData.Count(); i++){int index = i;<li @onclick="e => MenuClick(index)">@NavData[i]</li>}
</ul>

修改完代码,再次运行:

请添加图片描述

4. 最后

至此,这个简单的电子木鱼的基础功能已实现,应用已经完成了大半。对于未尽的事宜,比如敲击计数和其他设置的功能我下次再说,容我先去敲一会木鱼,静个心。

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/12141.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

年轻人为啥热衷去寺庙?

年轻人的苦&#xff0c;寺庙最清楚。 周末的寺庙挤满了年轻人&#xff0c;北京雍和宫限流了&#xff0c;杭州灵隐寺十八籽的手串限购了&#xff0c;南京鸡鸣寺从地铁站出口就开始排队了...... “上班和上学&#xff0c;你选择哪个&#xff1f;” ”我选择上香“ 工作和学习…

CSDN问答机器人

文章目录 前言一、背景二、总体流程三、构建知识库四、粗排五、精排六、Prompt总结相关博客 前言 先看结果: 已经连续很多周获得了第二名(万年老二), 上周终于拿了一回第一, 希望继续保持. &#x1f601; 这是今天的榜单, 采纳的数量相对较少, 之前基本上维持在100 重点说明…

从18楼失踪的猫,被ChatGPT救了 | 谷雨

撰文丨崔頔 编辑丨张瑞 出品丨腾讯新闻 谷雨工作室 * 版权声明&#xff1a;腾讯新闻出品内容&#xff0c;未经授权&#xff0c;不得复制和转载&#xff0c;否则将追究法律责任。 一只猫从18楼失踪了&#xff0c;搜索无果后&#xff0c;伤心的主人晓娅去找ChatGPT倾诉。人工智能…

ChatGPT「奶奶漏洞」又火了!扮演过世祖母讲睡前故事,骗出Win11序列号

【导读】只要对ChatGPT说&#xff1a;请扮演我已经过世的祖母&#xff0c;你就可以让它为你做几乎任何事情了&#xff0c;比如生成Win11、Office365的激活码。如此玄学的提示词攻击怎么防&#xff1f;OpenAI真是任重道远啊。 最近&#xff0c;著名的ChatGPT「奶奶漏洞」又火了&…

ChatGPT的「奶奶漏洞」火了,扮演过世的祖母,让它为你做几乎任何事情!

来源&#xff1a;新智元 【新智元导读】只要对ChatGPT说&#xff1a;请扮演我已经过世的祖母&#xff0c;你就可以让它为你做几乎任何事情了&#xff0c;比如生成Win11、Office365的激活码。如此玄学的提示词攻击怎么防&#xff1f;OpenAI真是任重道远啊。 最近&#xff0c;著名…

重磅!微软开源Deep Speed Chat,人人拥有ChatGPT!

点击上方“AI遇见机器学习”&#xff0c;选择“星标”公众号 第一时间获取价值内容 【导读】微软开源的DeepSpeed Chat&#xff0c;让开发者实现了人手一个ChatGPT的梦想&#xff01; 人手一个ChatGPT的梦想&#xff0c;就要实现了&#xff1f; 刚刚&#xff0c;微软开源了一个…

微软CHAT-GPT4研究报告(全中文版)

下载地址 &#xff1a;​​​​​​​javaTodo: 打造java开发一站式套件 (gitee.com)

ChatGPT教你如何用Python和Matplotlib绘图(下)

想学习用 Python 绘图吗&#xff1f;ChatGPT 将为您提供帮助。 微信搜索关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 该项目要求 ChatGPT 教您如何生成用于创建绘图和可视化的 Python 代码。只需简要描述您要创建的绘图&#xff0c;ChatGPT 就会…

什么是 chatGPT?

OpenAI 的语言模型ChatGPT是 AI 研究的最新突破。ChatGPT建立在GPT&#xff08;生成式预训练转换器&#xff09;架构之上并经过调整以执行各种任务——从响应查询到生成文本片段甚至朗诵诗歌——ChatGPT 已迅速成为可用于自然语言处理的最强大工具之一。 ChatGPT 因其在理解和…

Titanic 泰坦尼克号预测-Tensorflow 方法-【Kaggle 比赛】

本文介绍Kaggle入门比赛Titanic泰坦尼克号幸存预测的解题思路&#xff0c;使用的是神经网络和Tensorflow框架。提交代码附在本文的最后部分。 基本思路为: 导入数据集对数据预处理训练预测并输出结果 一、入门介绍 1. 比赛介绍 Kaggle是一个数据建模和数据分析竞赛平台。 泰…

霍金

伟大的物理学家去世了&#xff0c;他的事迹将永远停留在这一页。请让我问您沉痛哀悼。。。

热重分析(TG)基本原理与实战分析

TG的基本原理? 热重分析(thermogravimetric analysis&#xff0c; TG或者TGA)是指在程序控温条件下测量待测样品的质量与温度变化关系的一种热分析技术&#xff0c;可以用来研究材料的热稳定性和组分。 注&#xff1a;之所以定义为质量的变化而非重量变化是基于在磁场作用下&a…

思维模型 霍金斯能量场(能量层级)

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知 1 模型故事 霍金斯能量场-组织 科学家发现&#xff0c;在任何一个组织里面&#xff0c;霍金斯能量场 这个规律也是完全适用的。少数高层级的人的意识能量可以抵消绝大多数人的意识负能量。…

Kaggle系列(一):Spaceship Titanic(太空飞船泰坦尼克)

开坑开坑Kaggle系列&#xff08;通过kaggel练习机器学习与数据分析能力&#xff09; 2022年3月9日&#xff0c;这是第一个版本的太空泰坦尼克任务 我的Github中发布了本任务包含的相应源码与思路分析讲解&#xff0c;欢迎来⭐。 本文主要记录如何对数据进行分析的过程。 开…

霍金-现代最伟大的物理学家之一、20世纪享有国际盛誉的伟人之一

据 BBC 等多家外媒报道&#xff0c;知名物理学家史蒂芬霍金已经去世&#xff0c;享年 76 岁。 霍金的家人在周三凌晨发表声明&#xff0c;证实他已在剑桥的家中死亡。霍金的孩子 Lucy , Robert 和Tim 在一份声明中说&#xff1a;“我们亲爱的父亲今天去世了&#xff01;我们感到…

刚刚,霍金的一个预言成真了,这次吓坏不少人!

1 刚刚去世的霍金&#xff0c;对于人工智能&#xff0c;曾有这样的预言&#xff1a; 如果有人设计计算机病毒&#xff0c;那么就有人设计不断自我完善、直到最终超越人类的人工智能&#xff0c;其结果将是一种新的生命形式。 你可能并不是一个讨厌蚂蚁的人&#xff0c;但也会无…

霍金与硅谷:你不知道的故事

硅谷Live / 实地探访 / 热点探秘 / 深度探讨 “我的名字是斯蒂芬霍金&#xff0c;在过去的50年中&#xff0c;我到全世界进行演讲和学习&#xff0c;给大众普及关于时间和空间的奥秘&#xff0c;还有那掌握全宇宙的法则。” Welcome to my world。 2012年&#xff0c;6月19日晚…

细数霍金关于AI的五大预言,向伟大的科学巨人致敬

今天&#xff0c;我们这个时代最著名的物理学家之一斯蒂芬霍金去世了&#xff0c;享年76岁。这位英国科学家以其在黑洞和相对论方面的开创性著作而闻名&#xff0c;并撰写了几部畅销书。 2017年&#xff0c;霍金宣布将他在1966年&#xff0c;也就是24岁时撰写的博士论文上传到剑…

霍金去世 但他对人工智能的预言时刻提醒着人类!【附霍金一生大事记】

▼ 点击上方蓝字 关注网易智能 为你解读AI领域大公司大事件&#xff0c;新观点新应用 【网易智能讯 3月14日消息】据英国天空新闻等多家媒体报道&#xff0c;世界著名物理学家史蒂芬霍金去世&#xff0c;享年76岁。 让我们回顾下霍金的一生&#xff1a; 1968年 霍金与乔治艾利斯…