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

news2024/12/25 14:42:28

本文档注意参考官网(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 中的所有小部件和交互元素都在这个包中。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java集合HashSet——HashSet在底层原理

可点击此处:HashSet在底层原理 创建一个默认长度16,默认加载因子为0.75的数组,数组名table 16*0.75 12,如果存入的数据达到12,则数组自动扩容为原来的2倍 根据元素的哈希值跟数组的长度计算出应存入的位置 int index…

JAVA基础:正则表达式,String的intern方法,StringBuilder可变字符串特点与应用,+连接字符串特点

1 String中的常用方法2 1.1 split方法 将字符串按照指定的内容进行分割,将分割成的每一个子部分组成一个数组 分割内容不会出现在数组中 实际上该方法不是按照指定的简单的符号进行分割的,而是按照正则表达式进行分割 1.2 正则表达式 用简单的符号组合…

思维商业篇(4)—产业上下游定

思维商业篇(4)—产业上下游定位(微笑曲线) 产业上下游定位,帮助我们去观察一个企业在产业上下游中处于一个什么样的生态位。 上游 处于产业链开始端,百川东到海,百川的的起始端就是上游,东到海的海就是下游。 处在上游的企业一…

用友网络交付总监刘伟伟受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 用友网络科技股份有限公司区域交付总监刘伟伟先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾,演讲议题为“如何有效提升项目经理领导力”。大会将于10月26-27日在北京举办,主…

UE学习篇ContentExample解读-----------Blueprint_Overview

文章目录 总览描述批次阅览1.1 Blueprint- Hello World1.2 Blueprint- Components1.3 Blueprint- Variables1.4 Blueprint- ConstructionScript1.5 Blueprint- Event Graph1.6 Blueprint- Simple Math1.7 Blueprint- Flow Control 概念总结致谢: 总览描述 打开关卡后…

机械设计中倒角与倒圆角

我们常说,机械设计要做到“一切尽在掌握中”。 包含两层意思:一是所有的结构细节都是仔细思考过并且完整表达,不能靠在制造过程中猜测设计意图、由制造人员再设计或自由发挥。 二是所有的设计都是有根据的,不能靠拍脑袋任意发挥…

【路径规划】自动泊车的 Simulink 模型

摘要 本文介绍了一个用于自主机器人路径规划和导航的 Simulink 模型,该模型结合了路径跟踪算法(如 Pure Pursuit)和动态机器人模型,实现了复杂环境中的路径跟随和导航控制。实验结果表明,模型能够在给定路径上精确控制…

【neo4j】neo4j和Cypher 查询语言相关知识点

【neo4j】neo4j和Cypher 查询语言相关知识点 1.什么是neo4j Neo4j 是一个广泛使用的图形数据库管理系统(Graph Database Management System)。它是一种NoSQL数据库,专为存储和查询图形数据而设计。Neo4j 支持图形数据模型,允许用…

误差评估,均方误差、均方根误差、标准差、方差

均方根误差 RMSE/RMS 定义 RMSE是观察值与真实值偏差的平方,对于一组观测值 y i y_i yi​ 和对应的真值 t i t_i ti​ R M S E 1 n ∑ i 1 n ( y i − t i ) ,其中n是观测次数 RMSE\sqrt{\frac1n \sum_{i1}^n (y_i-t_i)} \text{,其中n是…

Python|OpenCV-实现识别目标图像中的圆圈(20)

前言 本文是该专栏的第22篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在处理图像检测项目的时候,可能会遇到需要检测目标图像中的“圆圈”需求。笔者在这里举个例子,如下图所示: 在图中有一个篮球,但是我们要找的目标对象并不是篮球,而是篮球它本身的这个…

智能BI平台项目

1.项目介绍 BI商业智能:数据可视化、报表可视化系统 4)发布订阅 Resource 是基于名称进行查找的,而Spring框架中更常用的 Autowired 则是基于类型进行查找的。如果找不到匹配的bean,Autowired 会抛出异常,而 Resource…

java项目之基于spring boot的多维分类的知识管理系统的设计与实现源码

项目简介 基于spring boot的多维分类的知识管理系统的设计与实现实现了以下功能: 基于spring boot的多维分类的知识管理系统的设计与实现的主要使用者管理员可以管理用户信息,知识分类,知识信息等,用户可以查看和下载管理员发布…

如何创建标准操作规程(SOP)[+模板]

创建、分发和管理流程文档和逐步说明的能力是确定企业成功的关键因素。许多组织依赖标准操作规程(SOP)作为基本形式的文档,指导他们的工作流程操作。 然而,SOP不仅仅是操作路线图;它们就像高性能车辆中的先进GPS系统一…

01_RabbitMQ安装及工作模式

一、消息队列MQ 中间件 1.1 什么是消息队列 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(Message Queue)是一…

5.工欲善其事,必先利其器!收集金融数据你必须先做这个!

在正式从网络上获取数据并存储到我们的数据库之前,我们还需要做一些准备工作。其中最重要的无疑是把Python环境配置好。 你可以不好好学习Python,毕竟我后边会一步步教大家,也会提供现成的Python脚本。但是你必须得在你的电脑上把Python安装…

YOLOv10改进,YOLOv10替换主干网络为PP-HGNetV2(百度飞桨视觉团队自研,独家手把手教程,助力涨点)

摘要 PP-HGNetV2(High Performance GPU Network V2) 是百度飞桨视觉团队自研的 PP-HGNet 的下一代版本,其在 PP-HGNet 的基础上,做了进一步优化和改进,最终在 NVIDIA GPU 设备上,将 “Accuracy-Latency Balance” 做到了极致,精度大幅超过了其他同样推理速度的模型。其在…

如何用ChatGPT制作一款手机游戏应用

有没有想过自己做一款手机游戏,并生成apk手机应用呢?有了人工智能,这一切就成为可能。今天,我们就使用ChatGPT来创建一个简单的井字棋游戏(Tic-Tac-Toe),其实这个过程非常轻松且高效。 通过Cha…

828 华为云征文|华为 Flexus 云服务器搭建萤火商城 2.0

在今天这个意义非凡的日子,我怀揣着满心的期待与憧憬,毅然踏上了利用华为 Flexus 云服务器搭建轻量级、高性能、前后端分离的电商系统萤火商城 2.0 的征程。这一旅程,注定充满了挑战与惊喜,犹如在浩瀚的数字海洋中探索未知的宝藏。…

java-----方法

目录 什么是方法? 方法的作用? 方法的格式: 方法的重载: 方法的内存原理 方法的值传递: 什么是方法? :程序中最小的执行单元(要么全执行,要么全不执行) public class methoddeom3 {public static void main(String[] args) {System.out.println("hello…

旧系统迁移新框架:FastAPI 的 WSGIMiddleware 让过程变得简单

在现代 Web 开发中,我们经常需要将新的技术与现有的系统整合。FastAPI,作为一个现代、快速(高性能)的 Web 框架,提供了与 WSGI 应用集成的能力,这使得 Django、Flask 等传统 Python Web 框架可以与 FastAPI…