Blockly使用一

1. Workspace工作空间

上文Blockly简述中已经描述Workspace的表现形式,由分类区、积木区、脚本区组成,Blockly内部的操作以Workspace为核心。所有的操作都是基于Workspace的,譬如Blockly的blocks的注入,事件的响应,积木组的执行等。

Workspace使用

将Blockly放入网页的最简单方法是将其注入空的“div”标签。
首先,包括核心Blockly脚本和核心Blocks模积木。引入js路径可能会有所不同,具体取决于您的网页与Blockly文件的位置:

<script src="blockly_compressed.js"></script>
<script src="blocks_compressed.js"></script>

然后包含用户语言的脚本(在本例中为英语):

<script src="msg/js/en.js"></script>

在html页面正文的某处添加一个空div并设置其大小,固定大小的工作空间:

<div id="blocklyDiv" style="height: 480px; width: 600px;"></div>

在页面的任何位置添加工具工具箱的结构(请参阅Toolbox工具箱定义):

<xml id="toolbox" style="display: none">
    <block type="controls_if"></block>
    <block type="controls_repeat_ext"></block>
    <block type="logic_compare"></block>
    <block type="math_number"></block>
    <block type="math_arithmetic"></block>
    <block type="text"></block>
    <block type="text_print"></block>
</xml>

最后,调用以下命令将Blockly注入空div。此脚本应位于页面底部,或由onload事件调用。

<script>
var workspace = Blockly.inject('blocklyDiv',
    {toolbox: document.getElementById('toolbox')});
</script>

可变大小工作空间

上面定义了一个固定大小的Workspace,如何将Web应用程序按照屏幕上的可用空间调整Blockly的大小,而不是固定大小呢?
将blocklyDiv元素放在blocklyArea元素上。为此,从blocklyDiv中删除任何高度和宽度样式并添加绝对定位:

<div id="blocklyDiv" style="position: absolute"></div>
<script>
  var blocklyArea = document.getElementById('blocklyArea');
  var blocklyDiv = document.getElementById('blocklyDiv');
  var workspace = Blockly.inject(blocklyDiv,
      {toolbox: document.getElementById('toolbox')});
  var onresize = function(e) {
    // Compute the absolute coordinates and dimensions of blocklyArea.
    var element = blocklyArea;
    var x = 0;
    var y = 0;
    do {
      x += element.offsetLeft;
      y += element.offsetTop;
      element = element.offsetParent;
    } while (element);
    // Position blocklyDiv over blocklyArea.
    blocklyDiv.style.left = x + 'px';
    blocklyDiv.style.top = y + 'px';
    blocklyDiv.style.width = blocklyArea.offsetWidth + 'px';
    blocklyDiv.style.height = blocklyArea.offsetHeight + 'px';
    Blockly.svgResize(workspace);
  };
  window.addEventListener('resize', onresize, false);
  onresize();
</script>

Grid

spacing、length、colour、snap分别定义格子Grid样式。

var workspace = Blockly.inject('blocklyDiv',
    {toolbox: document.getElementById('toolbox'),
     grid: {
            spacing: 20,
            length: 3,
            colour: '#ccc',
            snap: true
        }});
脚本区格子样式 -c

Zoom

zoom对Workspace工作空间进行缩放,可以点击图标和控制鼠标进行缩放。

var workspace = Blockly.inject('blocklyDiv',
    {toolbox: document.getElementById('toolbox'),
     zoom:{
          controls: true,
          wheel: true,
          startScale: 1.0,
          maxScale: 3,
          minScale: 0.3,
          scaleSpeed: 1.2
          }});

controls:是否开启缩放。
wheel:鼠标滚轮,设置为true以允许鼠标滚轮缩放。默认为false。
startScale:初始放大系数,默认为1。
maxScale:最大放大系数,默认为3。
minScale:最小的缩小系数,默认为0.3。
scaleSpeed:缩放速率,默认为1.2。

Workspace样式

Workspace样式分为2部分,积木样式、分类样式、

积木样式

积木样式目前由四个字段组成: colourPrimary, colourSecondary, colourTertiary和hat


积木样式 -c

主色colourPrimary(必需):Block Colour用作积木的背景色,可以用色调或十六进制值定义。
辅助颜色colourSecondary(可选):Shadow Block Colour如果积木是阴影积木,则使用此颜色。
三级颜色colourTertiary(可选):Border Colour这是积木的边框颜色。在主题之前,边框颜色由光明和黑暗路径组成,以便创建投影效果。
帽子hat(可选) :当用户想要将帽子添加到其积木时使用。

帽子积木 -c

分类样式

分类样式目前仅包含颜色属性。

{
    "colour":"290"
}

这是分类的颜色。该值可以定义为十六进制值或色调。通常这些颜色应与该分类中大多数积木的主色相同。这使用户可以轻松地分辨哪些积木属于哪个分类。

样式注入

清楚了积木和分类如何定义样式,那么怎样将样式注入到Workspace中呢?
定义list分类采用list_category样式,logic分类采用logic_category样式。

{
"list_category": {
    "colours": "#4a148c"
},
"logic_category": {
    "colour": "#01579b",
}}

对于分类,可以将样式标记添加到xml即可

<category name="Logic" categorystyle="logic_category">
</category>

定义list分类下的积木采用list_blocks样式,logic分类下的积木采用logic_blocks样式;

{
"list_blocks": {
    "colourPrimary": "#4a148c",
    "colourSecondary":"#AD7BE9",
    "colourTertiary":"#CDB6E9"
},
"logic_blocks": {
    "colourPrimary": "#01579b",
    "colourSecondary":"#64C7FF",
    "colourTertiary":"#C5EAFF"
}}

对于积木,只需积木在定义时将样式名称添加到积木"style":"logic_blocks"。

要想分类样式和积木样式起作用,最好的办法是在Workspace生成时,定义主题,使用options.theme在您的注入中包含。

{
    theme: Blockly.Theme(blockStyles, categoryStyles)
}

2. Toolbox工具箱

Toolbox工具箱指的是分类区和积木区,Toolbox在Blockly中使用一段XML存储,积木以某一小段XML代码组成,多个类似积木组成一段分类XML,分类积木的组合形成一段完整的XML,完整的XML被称为Toolbox,最终Toolbox对应的XML会被Blockly渲染为分类区和积木区。
工具箱是用户可以创建新积木的侧边菜单。工具箱的结构使用XML指定, XML可以是节点树,也可以是字符串表示。
将此XML注入到页面中时,会将其传递给Blockly。

<xml id="toolbox" style="display: none">
    <block type="controls_if"></block>
    <block type="controls_whileUntil"></block>
</xml>
<script>
    var workspace = Blockly.inject('blocklyDiv',
        {toolbox: document.getElementById('toolbox')});
</script>
工具箱 -c

Categories分类

用于将Blocks按模积木进行分类,Blockly默认定义了8种分类,每种分类使用不同的颜色,有不同功能,譬如Loops分类存放循环积木,Math分类存放数学操作积木等;

工具箱中的积木可以按分类组织。分类可嵌套,这里有两个分类( 'Control'和'Logic'),每个分类包含三个积木:

<xml id="toolbox" style="display: none">
    <category name="Control">
        <block type="controls_if"></block>
        <block type="controls_whileUntil"></block>
        <block type="controls_for">
    </category>
    <category name="Logic">
        <block type="logic_compare"></block>
        <block type="logic_operation"></block>
        <block type="logic_boolean"></block>
    </category>
</xml>
分类 -c

动态分类

有两类具有特殊行为的分类。变量和函数分类定义为没有内容,但具有'custom'属性 :'VARIABLE'或'PROCEDURE'。这些分类将使用适当的积木自动填充。

<category name="Variables" custom="VARIABLE"></category>
<category name="Functions" custom="PROCEDURE"></category>

Blocks积木

用于存放分类下的积木,不同积木代表不同的功能,在Blockly中,积木可以使用开发者工具,或者编写代码灵活定义积木;

阴影积木shadow

阴影积木是占位符积木,与常规积木不同,如果用户在其上放置积木,则会替换它们,相当于是一个默认值。


阴影积木 -c

分隔线sep

将两个分类使用线分离,常见于菜单分割线。


分割线 -c

按钮button和标签label

按钮和标签也可定义为积木,您可以将放入工具箱的位置放置按钮或标签。


按钮button和标签label -c

按钮应该有回调函数,而标签不需要。要为给定按钮设置回调函数,使用

yourWorkspace.registerButtonCallback(yourCallbackKey, yourFunction)

禁用积木disabled

可以使用可选的disabled属性单独禁用工具箱中的积木:禁用积木可用于限制用户的选择。也许高级积木可能会在某些成就后解锁。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容