如需创建自定义图标,您需要实现 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();
}