一、前言

MAUI,跨平台的 GUI 框架,基本介绍本文不再赘述。

话不多说,既然可以跨平台,那么我们就来实现一个在移动端很常用的控件:悬浮操作按钮(FAB,Floating Action Button)。

本文属于新手向、保姆级教程,大佬们请一笑而过。

相信看完的你,一定会有所收获!

本文地址:https://www.cnblogs.com/lesliexin/p/16416656.html


二、实现原理

原理很简单:将界面分为“两层”,下层是滚动界面,上层是悬浮按钮。


三、一步步实现

(一)创建 MAUI 应用项目

(本文使用的是:VS2022 Preview)

启动VS,按照流程提示,创建 MAUI 应用项目。

在创建成功后,会自带一些代码,可以编译运行体验一下。

(二)清空无关代码

这些自带的代码,几乎都是我们用不上的,所以我们对代码进行一下清理。清理后的代码如下。

1,前台 XAML 代码。

2,后台 CS 代码。

(三)布局方式选择

首先,悬浮按钮的位置是在屏幕的右下角,并不随着屏幕内容的滚动而变化位置。

所以,我们要使用用“绝对坐标”的方式,让悬浮按钮固定在右下角。

在 MAUI 中,“绝对坐标布局”对应的是:AbsoluteLayout

在“微软技术文档”中,对“AbsoluteLayout”的解释如下:

详见:https://docs.microsoft.com/en-us/dotnet/maui/user-interface/layouts/absolutelayout

在 XAML 页面,我们添加布局:

(四)悬浮按钮编写

因为悬浮按钮一般而言就是圆形纯色背景+功能图标,所以我们这里使用控件“ImageButton”来实现悬浮按钮。

在 XAML 页面,我们添加“ImageButton”:

为了使悬浮按钮一直处于右下角,我们需要用到绝对布局的附加属性:“AbsoluteLayout.LayoutFlags”和“AbsoluteLayout.LayoutBounds”。

在“微软技术文档”中,对“AbsoluteLayout”的解释如下:

详见:https://docs.microsoft.com/en-us/dotnet/maui/user-interface/layouts/absolutelayout

在设置“AbsoluteLayout.LayoutFlags”时,因为悬浮按钮的尺寸是固定的,位置也是固定的,所以我们使用“PositionProportional”,即:“位置”是按比例设置的,而“尺寸”则是按数值设置的。

既然悬浮按钮一直是处于右下角,所以我们将“AbsoluteLayout.LayoutBounds”的 x 和 y 都设置为 1:

(注:下文我们会单独设置尺寸,之所以不在这里将“AbsoluteLayout.LayoutBounds”设置为“1,1,56,56”,是为了将按钮图标缩小到合适的比例,因为这里为了简单化只用了一个按钮来实现悬浮按钮。)

根据 Android 官方 Material 风格建议,悬浮按钮的尺寸一般情况下是 56x56。

详见:https://material.io/components/buttons-floating-action-button

我们将按钮的尺寸设置为56x56,并设置为圆形:

到这里,我们编译运行一下,可以看到已经有一个按钮一直处于窗口的右下角:

这里我们发现按钮太靠边了,所以我们增加点边距:

效果如下:

然后,我们添加一个 PNG 图片,用作按钮图标:

效果如下:

已经有悬浮按钮那味了,但是这个图标还是有点大了。

这是因为我添加的 png 图片像素是 200x200,并没有进行尺寸缩小。主要是为了防止在高分辨率下变模糊。

所以接下来,我们对这个图标进行缩小。

以 WPF 上的经验,添加图片时,是可以设置图片尺寸的,但是在 MAUI 中,我愣是没找到如何去实现,残念。后续再研究研究。

那这里,我就通过设置 Padding 来变相实现图标的缩小:

效果如下:

到这里,悬浮按钮已经基本实现完成了,不过还有个问题,那就是在 Android 上(iOS 没测试),使用了 Padding 后的效果与 Windows 上的效果不一样,在 Android 上整个按钮缩小成了一个点(此处忘截图了)。

所以,在 Android 端,只能将 Padding 那行代码删除掉,然后效果就是未缩小前的图标。

接下来,再为悬浮按钮增加一个点击事件,弹窗提示一下。

XAML:

CS 后台代码:

(五)滚动区域实现

有了悬浮按钮,接下来就要增加滚动界面了。

因为 XAML 一般情况下都是代码越在下面,控件越在上层显示,所以我们在 ImageButton 上方添加滚动区域。

滚动区域是要布满整个窗口的,所以我们将附件属性“AbsoluteLayout.LayoutFlags”和“AbsoluteLayout.LayoutBounds”分别设置为 “All” 和 “0,0,1,1”:

为了演示用,我们增加一个垂直布局控件:

至于里面的控件,我们通过后台代码来动态生成。

首先为窗体绑定一个加载事件:

在后台代码中,我们动态添加 100 个 Label 控件:


四、效果演示

Windows 效果:

Android 效果:

iOS 和 MacOS,因为没有苹果设备,所以无法测试和演示。


五、总结

本文中实现悬浮按钮的方式,是很简单的,也很粗略,实现的效果只能说是差强人意。不过作为入门级的教程,还是可以的。

本人也是新接触 MAUI,在写代码的时候,确确实实感受到了很多“束缚感”,与 WPF 那种自由、灵活完全不同。

总的来说,个人看来,在写非Windows端软件时,MAUI 还是很不错的,特别是对 C# 人员非常友好,学习门槛很低。

本人水平有限,难免有所疏漏,欢迎各位读者评论指正。


六、源代码下载

https://files.cnblogs.com/files/lesliexin/MauiDemoFAB.7z


-【END】-

(原创)【MAUI】一步一步实现“悬浮操作按钮”(FAB,Floating Action Button)的更多相关文章

  1. android悬浮按钮(Floating action button)的两种实现方法

    原文: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1028/1857.html 最近android中有很多新的设计规范被引入 ...

  2. (原创)超详细一步一步在eclipse中配置Struts2环境,无基础也能看懂

    (原创)超详细一步一步在eclipse中配置Struts2环境,无基础也能看懂 1. 在官网https://struts.apache.org下载Struts2,建议下载2.3系列版本.从图中可以看出 ...

  3. [C#] (原创)一步一步教你自定义控件——01,TrackBar

    一.前言 技术没有先进落后之分,只有合不合适. WinForm有着非常多的优点,在使用WinForm久了之后,难免会觉得WinForm自带的某些控件外观上有些许朴素.或者功能上有些不如意,自然而然便想 ...

  4. [C#] (原创)一步一步教你自定义控件——04,ProgressBar(进度条)

    一.前言 技术没有先进与落后,只有合适与不合适. 本篇的自定义控件是:进度条(ProgressBar). 进度条的实现方式多种多样,主流的方式有:使用多张图片去实现.使用1个或2个Panel放到Use ...

  5. (原创)[C#] 一步一步自定义拖拽(Drag&Drop)时的鼠标效果:(一)基本原理及基本实现

    一.前言 拖拽(Drag&Drop),属于是极其常用的基础功能. 无论是在系统上.应用上.还是在网页上,拖拽随处可见.同时拖拽时的鼠标效果也很漂亮,像这样: 这样: 还有这样: 等等等等. 这 ...

  6. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  7. 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成

    阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...

  8. 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

     阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...

  9. 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文

    阅读目录 前言 明确业务细节 建模 实现 结语 一.前言 上一篇我们已经确立的购买上下文和销售上下文的交互方式,传送门在此:http://www.cnblogs.com/Zachary-Fan/p/D ...

随机推荐

  1. php个人博客搭建第二阶段②

    网站正文部分:热门博客的推荐: html代码: <!-- 网站正文部分 -->     <div class="content">         < ...

  2. 2. flddler响应显示乱码问题解决方案

    Fiddler是一款强大Web调试工具,它能记录所有客户端和服务器的HTTP请求. Fiddler启动的时候,默认IE的代理设为了127.0.0.1:8888,而其他浏览器是需要手动设置.但是一开始使 ...

  3. Es5 - 11 详解

    一.ES简介 ECMAScript,欧洲计算机制造商协会 ES是一种标准,而JS是ES的一种实现 每年的ES版本中都会引入新特性 二.NRM的安装与使用 NRM是切换源的工具 ES6 2.1安装 wi ...

  4. Selenium3自动化测试【29】文件上传

    日常在访问页面时,文件上传与下载操作也常常用到,因此在Web自动化测试中也会遇到文件上传的情况.针对上传功能,WebDriver并没有提供对应的方法.针对上传文件的场景主要有两种解决思路: 同步视频知 ...

  5. .NET MAUI RC2 发布,支持 Tizen 平台

    在.NET多平台应用程序UI(.NET MAUI)RC1之后仅两周,微软已经发布了RC2,并以新的Tizen支持为亮点..NET MAUI是微软对Xamarin.Forms的演变,因为它除了iOS和A ...

  6. 【计算机网络】Stanford CS144 Lab Assignments 学习笔记

    本文为我的斯坦福计算机网络课的编程实验(Lab Assignments)的学习总结.课程全称:CS 144: Introduction to Computer Networking. 事情发生于我读了 ...

  7. 简单的TRPG骰子

    又到了新一年的带团季了,今年准备用电脑来存放各种资料,自然也是需要一个简单的骰子工具了,反正也不复杂,就自己写了个,放着做个备份吧 主要功能是计算x1dy1+/-x2dy2+/-.....+/-con ...

  8. 视网膜血管分割代码(Pytorch实现)

    创建日期: 2021-12-24 17:00:00 update log(2021.12.24):B站视频删除了,回放看了一下,讲的不太行......2333,时间过得真快,转眼就是2022年了啊 2 ...

  9. 『现学现忘』Git基础 — 26、给Git命令设置别名

    目录 1.什么是Git命令的别名 2.别名的全局配置 3.别名的局部配置 4.删除所有别名 5.小练习 1.什么是Git命令的别名 Git中命令很多,有些命令比较长,有些命令也不好记,也容易写错. 例 ...

  10. 大陆出境海缆TPE APCN NCP APG简介

    目前我国的登陆站主要设立在三个城市 山东 山东青岛登陆站(隶属中国联通) EAC-C2C TPE(美国方向) 上海 上海崇明登陆站(隶属中国电信) APCN2(亚太) NCP(长线--美国,新建,亚太 ...