最新消息:

blockly-android模块化/可视化编程(一)——简单集成

Blockly 少儿编程 2850浏览 0评论

github地址

官方教学指南

在安卓中集成Blockly,我们可以实现如下图所示类似的可拖拽模块化/可视化编程,并可以自动生成JavaScript代码

20180228203954672

集成方式:

    1.将Github中的Blocklylib-core和blocklylib-vertical添加到我们项目的依赖中

20180228204049347

    2.创建Activity继承AbstractBlocklyActivity并实现至少以下四个方法:
            getBlockDefinitionsJsonPaths() 用于获取定义块数据的json文件的路径,返回值是文件在资产目录中的路径集合。例如下代码是导入Blockly库提供的默认块,也可以自己创建:
  1. @Override
  2. protected List<String> getBlockDefinitionsJsonPaths() {
  3. List<String> assetPaths = new ArrayList<>(DefaultBlocks.getAllBlockDefinitions());
  4. // 在此添加我们自己在资产目录创建的块.
  5. return assetPaths;
  6. }

            getToolboxContentsXmlPath() 用于获取工具箱toolbox数据的xml文件路径,返回值是文件在资产目录中的路径。例加载默认toolbox.xml:

  1. @Override
  2. protected String getToolboxContentsXmlPath() {
  3. return “default/toolbox.xml”;
  4. }

        getGeneratorsJsPaths() 用于获取块生成代码的生成器js文件路径,返回值是文件在资产目录中的路径集合。

  1. private static final List<String> JAVASCRIPT_GENERATORS = Arrays.asList(
  2. // 添加自己定义的生成器,默认块的生成器已经包含不需要我们填写
  3. );
  4. @Override
  5. protected List<String> getGeneratorsJsPaths() {
  6. return JAVASCRIPT_GENERATORS;
  7. }

   getCodeGenerationCallback() 用于当运行/播放按钮被点击,代码生成后的回调,返回值是回调对象CodeGenerationRequest.CodeGeneratorCallback(),在其重写方法onFinishCodeGeneration中对代码进行需要的操作。如:

  1. private final CodeGenerationRequest.CodeGeneratorCallback mCodeGeneratorCallback =
  2. new CodeGenerationRequest.CodeGeneratorCallback() {
  3. @Override
  4. public void onFinishCodeGeneration(final String generatedCode) {
  5. Toast.makeText(MainActivity.this, generatedCode, Toast.LENGTH_LONG).show();
  6. Log.e(TAG, “generatedCode:\n” + generatedCode);
  7. }
  8. };
  9. @NonNull
  10. @Override
  11. protected CodeGenerationRequest.CodeGeneratorCallback getCodeGenerationCallback() {
  12. return mCodeGeneratorCallback;
  13. }

简单举例的完整Activity代码:

  1. public class MainActivity extends AbstractBlocklyActivity {
  2. private static final String TAG = “MainActivity”;
  3. private static final List<String> JAVASCRIPT_GENERATORS = Arrays.asList(new String[]{
  4. “generators.js”
  5. });
  6. private final CodeGenerationRequest.CodeGeneratorCallback mCodeGeneratorCallback =
  7. new CodeGenerationRequest.CodeGeneratorCallback() {
  8. @Override
  9. public void onFinishCodeGeneration(final String generatedCode) {
  10. Toast.makeText(MainActivity.this, generatedCode, Toast.LENGTH_LONG).show();
  11. Log.e(TAG, “generatedCode:\n” + generatedCode);
  12. }
  13. };
  14. @NonNull
  15. @Override
  16. protected List<String> getBlockDefinitionsJsonPaths() {
  17. List<String> assetPaths = new ArrayList<>(DefaultBlocks.getAllBlockDefinitions());
  18. // 在此添加我们自己在资产目录创建的块.
  19. return assetPaths;
  20. }
  21. @NonNull
  22. @Override
  23. protected String getToolboxContentsXmlPath() {
  24. return “default/toolbox.xml”;
  25. }
  26. @NonNull
  27. @Override
  28. protected List<String> getGeneratorsJsPaths() {
  29. return JAVASCRIPT_GENERATORS;
  30. }
  31. @NonNull
  32. @Override
  33. protected CodeGenerationRequest.CodeGeneratorCallback getCodeGenerationCallback() {
  34. return mCodeGeneratorCallback;
  35. }
  36. }

        3.在清单文件中,在该Activity的节点中增加如下属性:

android:windowSoftInputMode="stateHidden|adjustPan"

        如果需要横屏显示,还可添加横屏属性:

android:screenOrientation="landscape"

        4.更改values/styles.xml中AppTheme的父类Style为 BlocklyVerticalTheme

  1. <style name=“AppTheme” parent=“BlocklyVerticalTheme”>
  2. <!– Customize your theme here. –>
  3. </style>

运行后如下图所示:

20180228204500349

您必须 登录 才能发表评论!