外观
Loading(加载指示器)
loading 插件带有 loading.dev 的 29 个加载指示器 ——Jakub Krehel 的 React 库 loading-dev——供原生 UI 使用:弧、环、点、条 和方块,由 MyGo 自己绘制,每个都是一个在显示时运动的元素。它们的外观和运动 与 loading.dev 的相同:同样的形状、关键帧和缓动函数,同样的节奏。它全部是 Go:没有 JavaScript 包,也没有需要 mygo.Use 的东西。有 CSS 的页面可以使 用 loading-dev 本身。
examples/loading 展示全部,连同它们的选项:
go
import "github.com/egoist/mygo/plugins/loading"
ui.Row(c).Gap(8).AlignItems(ui.Center).Children(func() {
loading.Arc(c).Label("Saving")
ui.Text(c, "Saving…")
})指示器
| 函数 | 绘制的内容 |
|---|---|
Arc | 一条开口的笔画绕圈旋转。 |
Atom | 三个环在一个圆内翻滚。 |
Blocks | 九个方块在网格上沿一道扫过的轨迹收缩和放大。 |
BouncingDots | 三个错开的点上下弹跳。 |
Cascade | 三条嵌套的弧展开成螺旋,然后啪地回到一条线上。 |
CircularDots | 八个点排成一个环,最亮的一个绕圈移动。 |
Classic | 十二条渐隐的条按径向图案排列。 |
ClassicV2 | 八个刻度排成一个环,依次点亮。 |
Clock | 一根指针在一个暗淡的表盘上扫过。 |
Comet | 一个完整的环淡入它的尾迹。 |
Compass | 四个刻度一次转四分之一圈。 |
Dual | 两条弧朝相反方向旋转。 |
Eclipse | 两个点交换位置,一个从另一个后面经过。 |
Flip | 一个方块绕一根轴翻转,然后绕另一根。 |
Gather | 四个方块聚拢、旋转,再散开。 |
Leap | 三个点排成一行,最后一个跳到最前。 |
LinearDots | 三个点从左到右依次点亮。 |
Loading | loading.dev 的标志,它最亮的一段绕环转圈。 |
Morph | 一个方块在旋转中圆化成圆形,再变回来。 |
Orbit | 一条渐隐的半环绕一个点旋转。 |
Pulse | 一个环从一个点向外荡开。 |
Radar | 一道渐隐的光束在一个暗淡的盘面上扫过。 |
Ring | 一条弧在一个暗淡的圆里旋转。 |
Ripple | 三个环从中心向外扩散。 |
Slide | 三个点滑进一个方块的空角。 |
Snake | 一条弧在绕行中伸展和收缩。 |
Swirl | 一个明亮的格子在方块内追逐自己的尾迹。 |
Trace | 一条短划描出一个圆角方块的轮廓。 |
Wave | 五条条子像波浪一样起落。 |
loading.All() 连同它们的名字列出它们,供一个画廊或让用户选择一个的设置 使用:
go
for _, s := range loading.All() {
ui.Column(c).Gap(8).Center().Children(func() {
s.New(c).Label(s.Name)
ui.Text(c, s.Name)
})
}选项
每个函数接受 loading.Options,它的零值是 loading.dev 的默认值:
go
loading.Ring(c, loading.Options{
Size: 32, // DIPs high: 20 by default
Color: t.Accent, // the theme's text color by default
Duration: 600 * time.Millisecond, // one cycle: the indicator's own by default
Easing: loading.EaseInOut,
Cap: loading.FlatCap,
})Size是指示器的高度,也是它的宽度,除了BouncingDots和LinearDots,它们是宽度为高度 1.15 和 0.9375 倍的点行。元素自身的大小 (由Size、Fill或父布局给出的)会把绘制居中缩放以适应。Color是它绘制的颜色,微弱的部分(环的轨道、淡出的点)以它们的透明 度使用它。零值是主题的Text。Duration是它的运动的一个周期,每个指示器不同:Arc是 800 毫秒,Slide是 2.4 秒。Paused让它停在当前;设回 false 后,它从那里继续。Easing是旋转的指示器(Arc、Atom、Clock、Comet、Dual、Orbit、Radar、Ring、Snake、Trace)如何转圈:Linear匀速,EaseInOut在每圈末尾减速,Stacked两者叠加,一圈两个周期,中间快。Cap决定Arc、Cascade、Dual、Ring、Snake和Trace笔画 的端头:RoundCap或FlatCap。Sweep是Blocks的方块的顺序:Diagonal、Rows或Columns。Direction让Ripple的环从中心向外(RippleOut)或向中心 (RippleIn)扩散。Origin让Wave的条从中间(WaveCenter)或底部(WaveBottom) 生长。
运动与无障碍
指示器每次被绘制时请求一帧,像一个旋转器那样(Painter.AnimationFrame), 并且只在它显示时:不在视野内的不绘制也不请求,它也不会重新构建视图。每个指示器 在它首次显示时开始它的周期,如同 CSS 动画。
当桌面要求更少的运动时(ui.Preferences.ReduceMotion:macOS 的"减弱动态 效果"、Windows 的动画效果或 GNOME 的动画被关闭),指示器以 loading.dev 为 减弱动效准备的姿势静止,例如变暗的点或环环相扣的环,并且不请求帧。
辅助技术看到一个长度未知的进度指示器。用 Label 为它命名,说明在加载什么: loading.Ring(c).Label("Loading messages")。