在之前的几个步骤中,我们为应用构建了一个图片网格。图片网格允许你同时查看多张图片。但是有时候,我们并不想一次看多张图片,而是想一张一张地浏览,这就是幻灯片的作用。接下来的几个步骤里,我们将为应用创建一个幻灯片功能。
我们的幻灯片结构如下:
Image
组成,顶部覆盖一个透明的 SlideshowOverlay
。SlideshowOverlay
包含两个 SlideshowNavigateButton
,分别位于两侧。为了保持最初实现的简单性,幻灯片目前只会显示一个占位符图片,暂时不会响应用户事件。我们将在后续步骤中去掉这些限制。
本步骤中,我们将从创建这两个 SlideshowNavigateButton
开始。
注意:如果你不想手动输入代码,可以在这里找到本步骤的完整代码:https://github.com/makepad/image_viewer/tree/main/step_8
在本步骤中,你将学习到:
对于两个 SlideshowNavigateButton
,我们需要一些箭头图标,因此首先需要将它们作为资源添加到应用中。
进入 resources
目录,下载以下文件到该目录:left_arrow.svg, right_arrow.svg
我们将使用这些文件作为箭头图标。
既然我们已经添加了箭头图标,现在我们需要在 DSL 代码中定义一些变量来引用这些图标。
在 app.rs
中,将以下代码添加到 live design
块的顶部:
这段代码定义了两个变量:LEFT_ARROW
和 RIGHT_ARROW
。我们将在 DSL 代码的其他地方使用这两个变量来引用箭头图标。
现在我们已经有了引用箭头图标的方法,接下来可以添加 SlideshowNavigateButton
的定义。SlideshowNavigateButton
是一个高而窄的条形按钮,占据其容器的整个高度,并在中间显示一个箭头图标。
在 app.rs
中,将以下代码添加到 live design
块中,位置在 App
定义之前:
该定义创建了一个具有以下属性的 SlideshowNavigateButton
:
width: 50
和 height: Fill
:确保按钮具有期望的宽度并填满容器的高度。draw_bg { ... }
:控制按钮背景的绘制方式。
color: #fff0
:默认情况下按钮完全透明。color_down: #fff2
:当按钮被按下时稍微可见一些。icon_walk { ... }
:控制按钮中图标的布局方式。
width: 9
:将图标宽度设为 9 像素。text: ""
:不显示按钮的文本标签。grab_key_focus: false
:点击按钮时不会获取键盘焦点(我们将在讲解键盘焦点工作原理时进一步说明)。现在是一个很好的时机来简单了解一下 Makepad 中的继承机制。
Makepad 中的继承非常类似于 JavaScript 等语言中的原型继承(Prototypal Inheritance):
{ ... }
用于定义一个对象。对象是属性的集合,每个属性都有名称和值。Object = { ... }
用于为一个对象赋予名称。<Base> { ... }
用于定义一个继承自 Base
对象的新对象。我们刚刚定义的 SlideshowNavigateButton
就是一个例子。它的定义如下:
这意味着 SlideshowNavigateButton
派生自 Button
。还记得我们通过 use link::widgets::*;
导入的内建组件吗?Button
就是其中之一。SlideshowNavigateButton
会复制 Button
的所有属性,并覆盖其中的一些属性以实现自定义行为。
你可能注意到,在我们定义 SlideshowNavigateButton
时,并没有为图标指定具体的图像。这是有意为之的,因为 SlideshowNavigateButton
本身是作为一个基类来使用的 —— 每当我们创建它的一个实例时,我们会为该实例单独指定一个图像作为图标。你马上就会在更新 App
的时候看到这个用法的例子。
现在我们已经有了 SlideshowNavigateButton
,接下来我们要更新 App
的定义,让它显示两个 SlideshowNavigateButton
,而不是之前的 ImageGrid
(稍后我们会在讲解如何在不同视图之间切换时,把 ImageGrid
放回来)。
在 app.rs
文件的 live design
代码块中,用以下代码替换 App
的定义部分:
如你所见,我们创建了两个 SlideshowNavigateButton
的实例。对于每个 SlideshowNavigateButton
,我们都重写了 draw_icon
的 svg_file
属性,使用了之前定义的箭头图标变量。
让我们检查一下目前的进展情况。
请确保你当前位于项目的包目录中,然后运行以下命令:
如果一切正常运行,你应该会看到两个按钮 —— 一个带有左箭头图标,另一个带有右箭头图标:
在这一步,我们创建了两个 SlideshowNavigateButton
。下一步,我们将创建 SlideshowOverlay
。