首先我們看一下兩個依賴分別是什麼作用:
blocklylib-core 核心庫。可以運行沒有UI(例如,用於代碼操作和生成)的情況下運行Blockly所需的所有內容
blocklylib-vertical 此模塊包含VerticalBlockViewFactory Blockly的默認垂直堆疊塊的視覺樣式
然後我們進入我們目前已知的唯一類AbstractBlocklyActivity,看看它有什麼重要的線索。
在我們集成時發現,即便我們沒有重寫Activity的onCreate方法設置佈局,我們依然可以正常顯示。
我們先看一下AbstractBlocklyActivity的onCreate方法做了些什麼
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
onCreateActivityRootView();
mBlocklyActivityHelper = onCreateActivityHelper();
if (mBlocklyActivityHelper == null) {
throw new IllegalStateException("BlocklyActivityHelper is null. "
+ "onCreateActivityHelper must return a instance.");
}
resetBlockFactory(); // Initial load of block definitions, extensions, and mutators.
configureCategoryFactories(); // After BlockFactory; before Toolbox
reloadToolbox();
// Load the workspace.
boolean loadedPriorInstance = checkAllowRestoreBlocklyState(savedInstanceState)
&& (getController().onRestoreSnapshot(savedInstanceState) || onAutoload());
if (!loadedPriorInstance) {
onLoadInitialWorkspace();
}
}
我們發現,它除了通過onCreateActivityRootView方法加載佈局外,還有一些初始化、配置、加載工具箱和工作空間等操作。
在onCreateActivityRootView方法中,添加了DrawerLayout和ActionBar。重點是調用了一個onCreateContentView來實現了主要佈局的加載:
protected View onCreateContentView(int containerId) {
return getLayoutInflater().inflate(R.layout.blockly_unified_workspace, null);
}
這個佈局就是我們沒有重新設置佈局而加載的默認佈局,當然,我們可以自己定義需要的佈局樣式
通過R.layout.blockly_unified_workspace佈局文件,我們可以搞明白整個佈局由哪幾部分組成
由4個Fragment和4個按鈕組成
如下圖分別是展開toolbox和trash的截圖:
看完整個AbstractBlocklyActivity類,我們會發現大部分操作都被BlocklyActivityHelper貫穿。
BlocklyActivityHelper可以讓Activity方便的控制Blockly,它可以讓我們在工作空間中包含一些按鈕來控制工作空間的縮放與重置、刪除塊等操作。
構造方法如下:
public BlocklyActivityHelper(AppCompatActivity activity, FragmentManager fragmentManager) {
mActivity = activity;
//初始化組成界面的4個Fragment
onFindFragments(fragmentManager);
if (mWorkspaceFragment == null) {
throw new IllegalStateException("mWorkspaceFragment is null");
}
//初始化工作空間、塊View工廠、代碼生成器、加載默認的xml文件
mWorkspaceHelper = new WorkspaceHelper(activity);
mBlockViewFactory = onCreateBlockViewFactory(mWorkspaceHelper);
mClipDataHelper = onCreateClipDataHelper();
mCodeGeneratorManager = new CodeGeneratorManager(activity);
//配置控制器
BlocklyController.Builder builder = new BlocklyController.Builder(activity)
.setClipDataHelper(mClipDataHelper)
.setWorkspaceHelper(mWorkspaceHelper)
.setBlockViewFactory(mBlockViewFactory)
.setWorkspaceFragment(mWorkspaceFragment)
.setTrashUi(mTrashBlockList)
.setToolboxUi(mToolboxBlockList, mCategoryFragment);
mController = builder.build();
//設置參數回調與變量監聽
onCreateVariableCallback();
onCreateMutatorListener();
//配置縮放、重置位置、垃圾桶按鈕
onConfigureTrashIcon();
onConfigureZoomInButton();
onConfigureZoomOutButton();
onConfigureCenterViewButton();
}