blockly二次開發(fā)中文文檔——3.4Toolbox工具箱

工具箱

工具箱是用戶可以創(chuàng)建新塊的側(cè)邊菜單果覆。工具箱的結(jié)構(gòu)使用XML指定呜笑,XML可以是節(jié)點樹夫否,也可以是字符串表示。
將此XML注入到頁面中時叫胁,會將其傳遞給Blockly凰慈。如果您不想手動輸入XML,我們建議您查看Blockly Developer Tools驼鹅。有了它微谓,您可以構(gòu)建一個工具箱并使用可視化界面自動生成其工具箱XML。

這是一個使用節(jié)點樹的最小示例:

<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>

以下是使用字符串表示的相同示例:

<script>
  var toolbox = '<xml>';
  toolbox += '  <block type="controls_if"></block>';
  toolbox += '  <block type="controls_whileUntil"></block>';
  toolbox += '</xml>';
  var workspace = Blockly.inject('blocklyDiv', {toolbox: toolbox});
</script>

以上兩者都創(chuàng)建了具有兩個塊的相同工具箱:


toolbox-minimal.png

如果存在少量塊输钩,則可以顯示它們而沒有任何類別(如上面的最小示例中所示)豺型。在此簡單模式下,所有可用塊都顯示在工具箱中买乃,主工作區(qū)上沒有滾動條姻氨,并且不需要垃圾桶。

分類

工具箱中的塊可以按類別組織剪验。這里有兩個類別('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>

下面是生成的工具箱,單擊“邏輯”類別功戚,以便可以看到彈出窗口中的三個邏輯塊:


toolbox-categories.png

類別的存在改變了Blockly的UI以支持更大的應(yīng)用程序娶眷。出現(xiàn)滾動條,允許無限大的工作空間啸臀。上下文菜單包含更多高級選項届宠,例如添加注釋或折疊塊。可以使用配置選項覆蓋所有這些功能席揽。

可以使用可選的顏色屬性為每個類別指定顏色顽馋。請注意英國拼寫。顏色是定義色調(diào)的數(shù)字(0-360)幌羞。

<xml id="toolbox" style="display: none">
  <category name="Logic" colour="210">...</category>
  <category name="Loops" colour="120">...</category>
  <category name="Math" colour="230">...</category>
  <category name="Colour" colour="20">...</category>
  <category name="Variables" colour="330" custom="VARIABLE"></category>
  <category name="Functions" colour="290" custom="PROCEDURE"></category>
</xml>

此顏色顯示為類別左側(cè)的矩形寸谜,并作為當(dāng)前所選類別的突出顯示:


toolbox-colours.png

主題

如果您已經(jīng)開始使用Blockly主題,那么您將需要添加categorystyle屬性而不是color屬性属桦,如下所示熊痴。

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

有關(guān)主題的更多信息,請查看《主題》聂宾。

動態(tài)類別

有兩類具有特殊行為果善。變量和函數(shù)類別定義為沒有內(nèi)容,但具有'custom'屬性 'VARIABLE'或'PROCEDURE'分別系谐。這些類別將使用適當(dāng)?shù)膲K自動填充巾陕。

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

開發(fā)人員還可以使用該custom屬性創(chuàng)建動態(tài)填充的彈出類別。例如纪他,要創(chuàng)建具有自定義顏色塊集的彈出按鈕:

  • 使用自定義屬性創(chuàng)建類別鄙煤。
    <category name="Colours" custom="COLOUR_PALETTE"></category>
    
  • 定義回調(diào)以提供類別內(nèi)容。此回調(diào)應(yīng)該在工作空間中返回并返回XML塊元素的數(shù)組茶袒。
    /**
     * Construct the blocks required by the flyout for the colours category.
    * @param {!Blockly.Workspace} workspace The workspace this flyout is for.
    * @return {!Array.<!Element>} Array of XML block elements.
    */
    myApplication.coloursFlyoutCallback = function(workspace) {
    // Returns an array of hex colours, e.g. ['#4286f4', '#ef0447']
    var colourList = myApplication.getPalette();
    var xmlList = [];
    if (Blockly.Blocks['colour_picker']) {
        for (var i = 0; i < colourList.length; i++) {
        var blockText = '<block type="colour_picker">' +
            '<field name="COLOUR">' + colourList[i] + '</field>' +
            '</block>';
        var block = Blockly.Xml.textToDom(blockText);
        xmlList.push(block);
        }
    }
    return xmlList;
    };
    
  • 在工作區(qū)上注冊回調(diào)梯刚。
    myWorkspace.registerToolboxCategoryCallback(
    'COLOUR_PALETTE', myApplication.coloursFlyoutCallback);
    

樹類別

類別可以嵌套在其他類別中。這里有兩個頂級類別('Core'和'Custom')薪寓,每個類別包含兩個子類別亡资,每個子類別包含塊:

<xml id="toolbox" style="display: none">
  <category name="Core">
    <category name="Control">
      <block type="controls_if"></block>
      <block type="controls_whileUntil"></block>
    </category>
    <category name="Logic">
      <block type="logic_compare"></block>
      <block type="logic_operation"></block>
      <block type="logic_boolean"></block>
    </category>
  </category>
  <category name="Custom">
    <block type="start"></block>
    <category name="Move">
      <block type="move_forward"></block>
      <block type="move_backward"></block>
    </category>
    <category name="Turn">
      <block type="turn_left"></block>
      <block type="turn_right"></block>
    </category>
  </category>
</xml>

請注意向叉,類別可以包含子類別和塊。在上面的例子中旷太,'Custom'有兩個子類別('Move'和'Turn'),以及它自己的一個塊('start')销睁。

擴(kuò)展

默認(rèn)情況下,加載Blockly時會顯示折疊類別冻记,但可以使用擴(kuò)展類別。

<category name="..." expanded="true">

塊分組

XML可以包含自定義塊或塊組冗栗。下面是四個塊:

  1. 一個簡單的 logic_boolean 塊:
    true.png
  2. 一個已修改為顯示數(shù)字42而不是默認(rèn)值0的math_number塊:
    42.png
  3. 一個controls_for塊演顾,它連接了三個math_number塊:
    count-with.png
  4. 一個math_arithmetic塊,它連接了兩個math_number陰影塊:
    1plus1.png

以下是在工具箱中生成這四個塊的代碼:

<xml id="toolbox" style="display: none">
  <block type="logic_boolean"></block>

  <block type="math_number">
    <field name="NUM">42</field>
  </block>

  <block type="controls_for">
    <value name="FROM">
      <block type="math_number">
        <field name="NUM">1</field>
      </block>
    </value>
    <value name="TO">
      <block type="math_number">
        <field name="NUM">10</field>
      </block>
    </value>
    <value name="BY">
      <block type="math_number">
        <field name="NUM">1</field>
      </block>
    </value>
  </block>

  <block type="math_arithmetic">
    <field name="OP">ADD</field>
    <value name="A">
      <shadow type="math_number">
        <field name="NUM">1</field>
      </shadow>
    </value>
    <value name="B">
      <shadow type="math_number">
        <field name="NUM">1</field>
      </shadow>
    </value>
  </block>
</xml>

這些自定義塊或組的XML與Blockly的XML保存格式相同葛虐。因此屿脐,為這些塊構(gòu)造XML的最簡單方法是使用Code應(yīng)用程序構(gòu)建塊宪卿,然后切換到XML選項卡并復(fù)制結(jié)果。工具箱會忽略x佑钾,y和id屬性,并且可能會將其刪除代赁。

陰影塊

陰影塊是占位符塊邮偎,可執(zhí)行多種功能:

  • 它們指示其父塊的默認(rèn)值义黎。
  • 它們允許用戶直接鍵入值廉涕,而無需獲取數(shù)字或字符串塊。
  • 與常規(guī)塊不同宠纯,如果用戶在其上放置塊层释,則會替換它們婆瓜。
  • 它們告知用戶預(yù)期的值類型贡羔。

無法直接使用代碼應(yīng)用程序構(gòu)建陰影塊乖寒。相反,可以使用常規(guī)塊磅轻,然后將XML中的<block ...>和</ block>更改為<shadow ...>和</ shadow>。

注意:陰影塊可能不包含變量字段或具有不是陰影的子項聋溜。

變量

大多數(shù)字段都很容易在工具箱中設(shè)置撮躁,只需要名稱屬性及其值。

<field name="NUM">1</field>

但是缨称,變量具有其他可選屬性祝迂,這些屬性會影響它們的創(chuàng)建方式。變量字段可以具有id和variabletype当凡。請注意纠俭,variabletype不使用駝峰式命名。

<field name="VAR" id=".n*OKd.u}2UD9QFicbEX" variabletype="Panda">Bai Yun</field>

如果設(shè)置了id朴则,那么在創(chuàng)建塊時钓简,variabletype(如果設(shè)置)和值必須匹配具有該id的任何現(xiàn)有變量外邓。如果不存在具有該id的變量,則將創(chuàng)建新變量侦啸。通常丧枪,id不應(yīng)包含在工具箱XML中。省略id允許變量在具有相同值和variabletype的情況下引用現(xiàn)有變量顶捷。

如果設(shè)置了variabletype屎篱,則將使用該類型創(chuàng)建變量葵蒂。如果未設(shè)置variabletype践付,則變量將具有默認(rèn)的''類型缺厉。如果使用類型變量,則必須設(shè)置variabletype命爬,因為Blockly不會推斷類型辐脖。

更多信息請參閱《變量》

分離器

在任意兩個類別之間添加<sep> </ sep>標(biāo)記將創(chuàng)建一個分隔符嗜价。

toolbox-separator.png

默認(rèn)情況下,每個塊與其下鄰居分開24個像素家淤∩桑可以使用'gap'屬性更改此分隔,該屬性將替換默認(rèn)間隙绿鸣。

<xml id="toolbox" style="display: none">
  <block type="math_number"></block>
  <sep gap="32"></sep>
  <block type="math_arithmetic">
    <field name="OP">ADD</field>
  </block>
  <sep gap="8"></sep>
  <block type="math_arithmetic">
    <field name="OP">MINUS</field>
  </block>
</xml>

調(diào)整塊之間的間隙允許在工具箱中創(chuàng)建邏輯塊組。

toolbox-gap.png

按鈕和標(biāo)簽

您可以在任何可以將塊放入工具箱的位置放置按鈕或標(biāo)簽痴施。

<xml id="toolbox" style="display: none">
  <block type="logic_operation"></block>
  <label text="A label" web-class="myLabelStyle"></label>
  <label text="Another label"></label>
  <block type="logic_negate"></block>
  <button text="A button" callbackKey="myFirstButtonPressed"></button>
  <block type="logic_boolean"></block>
</xml>

<style>
.myLabelStyle>.blocklyFlyoutLabelText {
  font-style: italic;
  fill: green;
}
</style>
label-and-button.png

您可以指定要應(yīng)用于按鈕或標(biāo)簽的CSS類名稱辣吃。在上面的示例中芬探,第一個標(biāo)簽使用自定義樣式,而第二個標(biāo)簽使用默認(rèn)樣式哩簿。

按鈕應(yīng)該有回調(diào)函數(shù),而標(biāo)簽不需要羡玛。要為給定按鈕設(shè)置回調(diào)函數(shù)宗苍,使用

yourWorkspace.registerButtonCallback(yourCallbackKey, yourFunction).

您的函數(shù)應(yīng)該接受點擊的按鈕作為參數(shù)讳窟。變量類別中的“創(chuàng)建變量...”按鈕是帶回調(diào)函數(shù)的按鈕的一個很好的示例。

禁用項

可以使用可選的disabled屬性單獨禁用工具箱中的塊:

<xml id="toolbox" style="display: none">
  <block type="math_number"></block>
  <block type="math_arithmetic"></block>
  <block type="math_single" disabled="true"></block>
</xml>

禁用塊可用于限制用戶的選擇是越。也許高級塊可能會在某些成就后解鎖碌上。


toolbox-disabled.png

更改工具箱

應(yīng)用程序可以通過單個函數(shù)調(diào)用隨時更改工具箱中可用的塊:

workspace.updateToolbox(newTree);

與初始配置期間的情況一樣馏予,newTree可以是節(jié)點樹或字符串表示。唯一的限制是模式不能改變;也就是說呢岗,如果最初定義的工具箱中有類別蛹尝,則新工具箱也必須具有類別(盡管類別可能會更改)。同樣挫酿,如果最初定義的工具箱沒有任何類別愕难,則新工具箱可能沒有任何類別。

請注意葱弟,此時更新工具欄會導(dǎo)致一些小的UI重置:

  • 在具有類別的工具箱中猜丹,彈出按鈕在打開時將關(guān)閉射窒。
  • 在沒有類別的工具箱中将塑,用戶更改的任何字段(例如下拉列表)將恢復(fù)為默認(rèn)值制市。
  • 任何工具箱長到超出頁面時,將使其滾動條跳到頂部开财。

這是一個包含類別和塊組的樹的現(xiàn)場演示误褪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兽间,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恤溶,更是在濱河造成了極大的恐慌帜羊,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奶段,居然都是意外死亡痹籍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門刺洒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吼砂,“玉大人渔肩,你說我怎么就攤上這事拇惋∧ㄊ#” “怎么了蓉坎?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵蛉艾,是天一觀的道長。 經(jīng)常有香客問我拓瞪,道長助琐,這世上最難降的妖魔是什么兵钮? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮泰演,結(jié)果婚禮上屁药,老公的妹妹穿的比我還像新娘酿箭。我一直安慰自己,他們只是感情好缭嫡,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布妇蛀。 她就那樣靜靜地躺著,像睡著了一般眷茁。 火紅的嫁衣襯著肌膚如雪纵诞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天籽腕,我揣著相機與錄音纸俭,去河邊找鬼。 笑死郎楼,一個胖子當(dāng)著我的面吹牛女轿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播傅寡,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼荐操,長吁一口氣:“原來是場噩夢啊……” “哼珍策!你這毒婦竟也來了攘宙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤疗绣,失蹤者是張志新(化名)和其女友劉穎铺韧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塔逃,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡湾盗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年淹仑,在試婚紗的時候發(fā)現(xiàn)自己被綠了肺孵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡吓肋,死狀恐怖瑰艘,靈堂內(nèi)的尸體忽然破棺而出紫新,到底是詐尸還是另有隱情,我是刑警寧澤囤耳,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布偶芍,位于F島的核電站匪蟀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏材彪。R本人自食惡果不足惜段化,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望普气。 院中可真熱鬧佃延,春花似錦履肃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碾局。三九已至奴艾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間像啼,已是汗流浹背潭苞。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工此疹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人振诬。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓衍菱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辫呻。 傳聞我的和親對象是個殘疾皇子琼锋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容