如要创建自定义图标,您需要实现 IIcon
接口。这会告知 Blockly,您希望如何渲染图标,在用户点击图标时希望它执行的操作等。
我们建议为 Icon
抽象类创建子类,因为它已在 IIcon
接口中提供了许多方法的默认实现。
class MyIcon extends Blockly.icons.Icon {
// The constructor should always take in the source block so that svg elements
// can be properly created.
constructor(sourceBlock) {
super(sourceBlock);
}
}
指定图标的类型
getType
方法会返回一个表示图标类型的值。它用于注册图标以进行序列化,以及从 getIcon
检索图标。
JavaScript
getType() {
return new Blockly.icons.IconType('my_icon');
}
TypeScript
getType(): Blockly.icons.IconType<MyIcon> {
return new Blockly.icons.IconType<MyIcon>('my_icon');
}
创建图标的视图
图标的视图是指位于块上的 SVG 元素。
初始化视图
您可以使用 initView
方法创建位于块上的图标的 SVG 元素。新元素应为 this.svgRoot
元素的子元素,以便在图标销毁后自动清除这些元素。
Blockly.utils.dom
模块提供了一个用于实例化 SVG 的简洁接口。
initView(pointerdownListener) {
if (this.svgRoot) return; // Already initialized.
// This adds the pointerdownListener to the svgRoot element.
// If you do not call `super` you must do this yourself.
super.initView(pointerdownListener);
Blockly.utils.dom.createSvgElement(
Blockly.utils.Svg.CIRCLE,
{
'class': 'my-css-class',
'r': '8',
'cx': '8',
'cy': '8',
},
this.svgRoot // Append to the svgRoot.
);
}
返回尺寸
getSize
方法会返回图标的大小,以便渲染程序可以调整块的宽度,使其足够宽。
大小以任意“工作区单元”为单位(不会随着工作区更改缩放而改变)。
getSize() {
return new Blockly.utils.Size(16, 16);
}
设置顺序
图标在块内具有静态顺序。例如,内置更改器图标始终显示在注释图标前面,而注释图标显示在警告图标前面。
该顺序由 getWeight
方法返回的值控制。正权重较高的图标渲染在正权重较低的图标之后。
getWeight() {
return 10;
}
实现 onClick 行为
许多图标都是互动式的,点击图标即可执行操作。例如,内置图标在用户点击时均会显示一个气泡。您可以使用 onClick
方法来实现这一点。
onClick() {
// Do something when clicked.
}
响应屏蔽更改
有些图标还需要响应代码块中的更改,尤其是对可修改性和收起状态的更改。
可编辑性
如果图标的行为方式应根据图块是否可修改而有所不同(例如,当图块不可修改时,其行为不可点击),请实现 updateEditable
方法。当块的可修改状态发生更改时,系统会自动调用此方法。
updateEditable() {
if (this.sourceBlock.isEditable()) {
// Do editable things.
} else {
// Do non-editable things.
}
}
收起程度
代码块收起时,系统会显示一些图标,但默认情况下不会显示。如果您希望系统显示您的图标,请替换 isShownWhenCollapsed
方法以返回 true
。
isShownWhenCollapsed() {
return true;
}
然后替换 updateCollapsed
方法。
updateCollapsed() {
// By default icons are hidden when the block is collapsed. We want it to
// be shown, so do nothing.
}
处置图标
在处理时,图标应清除所有 dom 元素或外部引用。默认情况下,附加到 this.svgRoot
的任何内容都会被销毁,但其他引用需要手动清理。此操作应在 dispose
方法中完成。
dispose() {
// Always call super!
super.dispose();
this.myBubble?.dispose();
this.myOtherReference?.dispose();
}