Fyne ( go跨平台GUI )中文文档- 架构 (八)完结

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法

go代码展示为Go 1.16 及更高版本, idegoland2021.2

 这是一个系列文章:

Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客

Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客

Fyne ( go跨平台GUI )中文文档-绘图和动画(三)-CSDN博客

Fyne ( go跨平台GUI )中文文档-容器和布局 (四)-CSDN博客

Fyne ( go跨平台GUI )中文文档-小部件 (五)-CSDN博客

Fyne ( go跨平台GUI )中文文档- 数据绑定 (六)-CSDN博客

Fyne ( go跨平台GUI )中文文档- 扩展Fyne (七)-CSDN博客

Fyne ( go跨平台GUI )中文文档- 架构 (八)完结-CSDN博客

8 架构

8.1 几何学

Fyne 应用程序基于每个窗口 1 个画布。每个画布都有一个根 CanvasObject,它可以是单个小部件或许多子对象的容器,其大小和位置由布局控制。

位置

每个画布的原点位于左上角 (0, 0),UI 的每个元素都可以根据输出设备进行缩放,因此 API 不描述像素或精确测量值。例如,在 120DPI 显示器上,位置 (10, 10) 可能从原点向右和向下 10 像素,但在 HiDPI(或“Retina”)显示器上,这可能更接近 20 像素。

CanvasObject 引用的每个位置都相对于它的父级。这对于布局算法很重要,但对于Tappable.Tapped(PointEvent)处理程序等情况下的开发人员也很重要。这里的 X/Y 坐标将从按钮的左上角而不是整个画布计算。这是为了让代码尽可能独立。

像素大小

与其他基于矢量的 GUI 库一样,Fyne 坐标需要基于一些基线监视器分辨率。所有[缩放]都与此值相关。对于 fyne,分辨率为 120DPI。这意味着fyne.Size当您的显示器为 120DPI 并且比例值都设置为 1 时,其中提到的尺寸将为 1=1px。对于 HiDPI 屏幕,如上所述,实际 DPI 可能更接近 240,在移动设备上它可以甚至是360或更高。为了管理处理这种复杂性,工具包在内部管理缩放,因此您的应用程序将始终看起来正确的大小。如果用户将比例设置为更小,那么他们的应用程序将始终具有比正常字体、按钮等更小的字体,并且当他们指定更大时,您的应用程序将按比例放大以适应。

与Material Design相比,我们可以看到它们的基线 DPI 为160,尽管数学相似,但实际数字会有所不同。这意味着 Fyne 中与设备无关的尺寸使用较小的数字来表示相同的物理尺寸。例如,18在 Fyne 中较高的图标将24在标准材料设计(例如 Android)应用程序中调整大小。这在构建应用程序时无关紧要,但在与具有 Material Design 的设计师或专家合作时可能很重要。

如果您开始加载位图图像,那么像素大小会很重要。通常这些会适当缩放,但如果您指定 FillMode=fyne.FillOriginal,则由于像素密度,不同设备上的实际图像大小会有所不同。通常,此功能将在Scroll容器内使用。Fyne 还定义了一个canvas.Raster原语,它将精确地以输出设备的像素密度绘制像素。这使您的代码能够以尽可能高的输出分辨率进行绘制,而无需了解您正在运行的设备的详细信息。如果由于某种原因需要“像素完美”定位,则需要CanvasObject.Size()*Canvas.Scale().

8.2 缩放

Fyne 完全使用矢量图形构建,这意味着用 Fyne 编写的应用程序可以完美地缩放到任何大小(不仅仅是整数增量)。这对于移动设备和高端计算机上越来越受欢迎的高密度显示器来说是一个很大的好处。计算默认比例值以匹配您的操作系统 - 在某些系统上这是用户配置,而在其他系统上则根据屏幕的像素密度(DPI - 每英寸点数)。如果 Fyne 窗口移动到另一个屏幕,它将重新缩放并相应地调整窗口大小!我们称之为“自动缩放”,它旨在让应用程序用户界面在您更改显示器时保持相同大小。
您可以使用应用程序的FYNE_SCALE或通过使用环境变量fyne_settings设置特定比例来调整应用程序的大小。这些值可以使内容大于或小于系统设置,使用“1.5”将使内容变大 50% 或设置 0.8 将使其变小 20%。

8.3 小部件

Fyne 工具包中的小部件专为干净和愉快的用户交互而设计,遵循标准主题并支持快速应用程序开发、可靠测试和易于维护。有多种设计考虑可以促进这种雄心壮志,我们将在此页面中进行探讨。

行为 API

关于标准小部件,您会注意到的一件事是 API 完全与行为和状态有关 - 但很少控制元素的实际外观。这是设计使然。它使我们的代码和应用程序开发人员的代码能够专注于小部件的行为,以便它的渲染过程可以留给其他代码。这使得测试变得更加容易,事实上完整的应用程序可以通过内存中的单元测试运行,而无需渲染应用程序。

您可以[扩展现有小部件] 以添加新行为,而无需担心它是如何呈现的。也可以[编写自己的]组件,应用程序不限于使用提供的小部件集。在构建自己的小部件时,您会注意到渲染细节与状态完全分开 - 这是上面提到的设计的一部分。 WidgetRenderer(呈现代码Widget)通常包含对将呈现以访问状态或其他信息的小部件的引用。当小部件状态发生变化时,将Refresh()调用 - 然后将要求渲染器刷新并且它应该更新显示以反映新状态。建议自定义小部件使用当前的Theme但可以选择在需要的地方指定自己的尺寸、颜色和图标。

内容填充

标准小部件使用主题指定的填充在其图形组件周围留出适当的空间。在该v2.0.0版本中,大多数小部件的高度和基线都进行了标准化,以确保标准布局在默认情况下能够很好地对齐。如果您正在构建自定义小部件,建议您遵循这些准则。

的值theme.Padding()在布局中用于分隔容器的元素,它在应用程序的各个部分周围创建标准化空间。然而,一些小部件的内容应该从范围的边缘插入。考虑一下Entry,它有一个背景和一个延伸到边缘的下划线,但它的内容应该是插入的。所以我们已经标准化了用于插入的间距量,以便对齐匹配。

小部件的标准插入或内容填充当前定义为2*theme.Padding()padding的标准值是 4表示标准插图是8. 您可以看到(文本)内容Label 以及Entry如何插入这么多,以便它们的内容在彼此相邻放置时将水平和垂直对齐。

建议自定义小部件包含相似的尺寸,以便它们与标准小部件很好地配合。

8.4 组织和包

Fyne 项目分为许多包,每个包提供不同类型的功能。它们如下:

  • fyne.io/fyne/v2

这个导入提供了所有 Fyne 代码通用的基本定义

包括数据类型和接口。

  • fyne.io/fyne/v2/app

应用程序包提供启动新应用程序的 API。

通常你只需要app.New()或app.NewWithID()。

  • fyne.io/fyne/v2/canvas

canvas 包提供了 Fyne 中的所有绘图 API。

完整的 Fyne 工具包由这些原始图形类型组成。

  • fyne.io/fyne/v2/container

容器包提供了用于布局和组织应用程序的容器。

  • fyne.io/fyne/v2/data/binding

绑定包包含将数据源绑定到小部件的方法。

  • fyne.io/fyne/v2/data/validation

验证包为验证小部件内的数据提供收费。

  • fyne.io/fyne/v2/dialog

对话框包包含确认、错误和文件保存/打开等对话框。

  • fyne.io/fyne/v2/layout

布局包提供各种布局实现供使用

使用容器(在后面的教程中讨论)。

  • fyne.io/fyne/v2/storage

存储包提供存储访问和管理功能。

  • fyne.io/fyne/v2/test

使用测试中的工具可以更轻松地测试应用程序
包裹。

  • fyne.io/fyne/v2/widget

大多数图形应用程序都是使用一组小部件创建的。

Fyne 中的所有小部件和交互元素都在这个包中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

恶意Bot流量识别分析实践

1、摘要 随着互联网的发展,自动化工具和脚本(Bots)的使用越来越普遍。虽然一些善意 Bots 对于网站的正常运行和数据采集至关重要,但恶意 Bots 可能会对网站带来负面影响,如爬取敏感信息、恶意注册、刷流量等。因此&am…

某建筑市场爬虫数据采集逆向分析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 目标网站 aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55P2NvbXBsZXhuYW1lPSVFNiVCMCVCNA 提示:以下是本篇文章正文内容,下面…

十八,Spring Boot 整合 MyBatis-Plus 的详细配置

十八,Spring Boot 整合 MyBatis-Plus 的详细配置 文章目录 十八,Spring Boot 整合 MyBatis-Plus 的详细配置1. MyBatis-Plus 的基本介绍2. Spring Boot 整合 MyBatis Plus 的详细配置3. Spring Boot 整合 MyBatis plus 注意事项和细节4. MyBatisx 插件的…

空栈压数 - 华为OD统一考试(E卷)

2024华为OD机试(E卷D卷C卷)最新题库【超值优惠】Java/Python/C合集 题目描述 向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设:栈顶至栈底整数依次编号为 $n_1, n_2, \dots, n_x $,其…

SPI驱动学习六(SPI_Master驱动程序)

目录 前言一、SPI_Master驱动程序框架1. SPI传输概述1.1 数据组织方式1.2 SPI控制器数据结构 2. SPI传输函数的两种方法2.1 老方法2.2 新方法 二、如何编写SPI_Master驱动程序1. 编写设备树2. 编写驱动程序 三、SPI_Master驱动程序简单示例demo1. 使用老方法编写的SPI Master驱…

NLP 主流应用方向

主流应用 文本分类文本匹配序列标注生成式任务 应用细分 常见落地应用举例: 文本纠错句法分析文本翻译话者分离 本质为文本分类任务数字归一化 实现数字映射,提高内容可读性 如将一九九九转1999

【高分系列卫星简介——高分三号卫星(GF-3)】

高分三号卫星(GF-3) 高分三号(GF-3)是我国首颗高分辨率、C频段、多极化合成孔径雷达(SAR)卫星,由中国空间技术研究院北京空间飞行器总部设计部研制,并于2016年8月10日成功发射。该卫…

flash_attention简要笔记

优化效果 原来,attention部分的计算量和中间激活占用显存的复杂度都是 O ( N 2 ) O(N^2) O(N2) 计算量部分原来QK矩阵乘和attn_scoreV矩阵乘的计算量,复杂度都是 O ( N 2 ) O(N^2) O(N2);中间激活因为中间有一个attn_score,所以复…

10.解析解方法推导线性回归——不容小觑的线性回归算法

引言 线性回归是许多复杂机器学习模型的基础。作为一种基本的机器学习方法,线性回归提供了清晰的思路和工具,通过理解其推导过程,可以更好地掌握机器学习的基本原理和模型设计。 通过阅读本篇博客,你可以: 1.学会如…

win11永久关闭Windows Defend

# Win11 Microsoft Defender 防病毒 彻底关闭 Win11 Microsoft Defender 防病毒关闭 **WinR****——输入 gpedit.msc ,打开本地组策略编辑器——计算机配置——管理模板——Windows组件——Microsoft Defender 防病毒——关闭 Microsoft Defender 防病毒策略——设置…

免费在线压缩pdf 压缩pdf在线免费 推荐简单好用

压缩pdf在线免费?在日常生活和工作学习中,处理PDF文件是常见任务。但有时PDF文件体积较大,给传输、存储和分享带来不便。因此,学习PDF文件压缩技巧十分必要。压缩PDF文件是指通过技术手段减小文件占用的存储空间,同时尽…

kafka 一步步探究消费者组与分区分配策略

本期主要聊聊kafka消费者组与分区 消费者组 & 消费者 每个消费者都需要归属每个消费者组,每个分区只能被消费者组中一个消费者消费 上面这段话还不够直观,我们举个例子来说明。 订单系统 订单消息通过 order_topic 发送,该topic 有 5个分区 结算系…

基于YOLO算法的网球运动实时分析-击球速度测量-击球次数(附源码)

这个项目通过分析视频中的网球运动员来测量他们的速度、击球速度以及击球次数。该项目使用YOLO(You Only Look Once)算法来检测球员和网球,并利用卷积神经网络(CNNs)来提取球场的关键点。此实战项目非常适合提升您的机…

基于 Web 的工业设备监测系统:非功能性需求与标准化数据访问机制的架构设计

目录 案例 【说明】 【问题 1】(6 分) 【问题 2】(14 分) 【问题 3】(5 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于 Web 系统架构设计的叙述,回答问题 1 至问题 3 。 【说明】 某公司拟开发一款基于 Web 的…

【JavaEE】多线程编程引入——认识Thread类

阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你! 目录 引入: 一:Thread类 1:Thread类可以直接调用 2:run方法 &a…

springboot每次都需要重设密码?明明在springboot的配置中设置了密码

第一步:查看当前的密码是什么? 打开redis-cli.exe,输入config get requirepass,查看当前的密码是什么? 接着,修改redis的配置文件,找到redis的安装目录,找到相关的conf文件&#x…

FreeRTOS下UART的封装

FreeRTOS下UART的封装_哔哩哔哩_bilibili Git使用的一个BUG: 当出现这个问题是因为git本身的安全证书路径有问题,我们需要重新指定路径 P1:UART程序层次

【2024】前端学习笔记7-颜色-位置-字体设置

学习笔记 1.定义:css2.颜色:color3.字体相关属性:font3.1.字体大小:font-size3.2.字体风格:font - style3.3.字体粗细:font - weight3.4.字体族:font - family 4.位置:text-align 1.…

K8s容器运行时,移除Dockershim后存在哪些疑惑?

K8s容器运行时,移除Dockershim后存在哪些疑惑? 大家好,我是秋意零。 K8s版本截止目前(24/09)已经发布到了1.31.x版本。早在K8s版本从1.24.x起(22/05),默认的容器运行时就不再是Doc…

最新Kali Linux超详细安装教程(附镜像包)

一、镜像下载: 链接:https://pan.baidu.com/s/1BfiyAMW6E1u9fhfyv8oH5Q 提取码:tft5 二、配置虚拟机 这里我们以最新的vm17.5为例。进行配置 1.创建新的虚拟机:选择自定义 2.下一步 3.选择稍后安装操作系统 4.选择Debian版本 因…