google/bolckly-android学习笔记(二)编辑ToolBox侧边菜单栏

先上图,看一下效果
在这里插入图片描述更改位置位于blocklylib-core/src/main/java/com/google/blockly/android/ui
CategoryTabs.java文件中的onCreateLabel()和onBindLabel()方法

 /** Manages TextView labels derived from {@link R.layout#default_toolbox_tab}. */
    protected class DefaultTabsAdapter extends CategoryTabs.LabelAdapter {
        @Override
        public View onCreateLabel() {
            return LayoutInflater.from(getContext())
                    .inflate(R.layout.test_toolbox_imgtext, null);
        }

        /**
         * Assigns the category name to the {@link TextView}. Tabs without labels will be assigned
         * the text {@link R.string#blockly_toolbox_default_category_name} ("Blocks" in English).
         *
         * @param labelView The view used as the label.
         * @param category The {@link BlocklyCategory}.
         * @param position The ordering position of the tab.
         */
        @Override
        public void onBindLabel(View labelView, BlocklyCategory category, int position) {
            String labelText = category.getCategoryName();
            if (TextUtils.isEmpty(labelText)) {
                labelText = getContext().getString(R.string.blockly_toolbox_default_category_name);
            }
            ImageView imageView = labelView.findViewById(R.id.robot_img);
            TextView textView = labelView.findViewById(R.id.robot_text);
            //((TextView) labelView).setText(labelText);

            switch (position){
                case 0:
                    imageView.setImageResource(R.drawable.apple);
                    textView.setText(R.string.apple);
                    break;
                case 1:
                    imageView.setImageResource(R.drawable.watermelon);
                    textView.setText(R.string.watermelon);
                    break;
                case 2:
                    imageView.setImageResource(R.drawable.strawberry);
                    textView.setText(R.string.strawberry);
                    break;
                case 3:
                    imageView.setImageResource(R.drawable.lemur);
                    textView.setText(R.string.lemur);
                    break;
                case 4:
                    imageView.setImageResource(R.drawable.tiger);
                    textView.setText(R.string.tiger);
                    break;
                case 5:
                    imageView.setImageResource(R.drawable.zebra);
                    textView.setText(R.string.zebra);
                    break;
                default:
                    break;

            }
        }

    }

需要注意的是ToolBox侧边菜单栏图片方向的更改位置在布局文件中的
blockly:labelRotation属性,

 <fragment android:name="com.google.blockly.android.CategorySelectorFragment"
        android:id="@id/blockly_categories"
        android:layout_below="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        blockly:labelRotation="none"
        blockly:scrollOrientation="vertical"
        tools:ignore="MissingPrefix"/>

blockly:labelRotation的属性值会影响onCreateLabel布局中控件的宽高的设置,为了简单,横屏应用可以直接设置为none,
具体影响的代码为blocklylib-core目录下的RotatedViewGroup.java文件

 @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int horzPadding = getPaddingLeft() + getPaddingRight();
        int vertPadding = getPaddingTop() + getPaddingBottom();

        int childWidthMSpec, childHeightMSpec;
        if (isChildRotated()) {
            // Swap both measure specs, and subtracted paddings.
            childWidthMSpec = MeasureSpec.makeMeasureSpec(
                    Math.max(MeasureSpec.getSize(heightMeasureSpec) - vertPadding, 0),
                    MeasureSpec.getMode(heightMeasureSpec));
            childHeightMSpec = MeasureSpec.makeMeasureSpec(
                    Math.max(MeasureSpec.getSize(widthMeasureSpec) - horzPadding, 0),
                    MeasureSpec.getMode(widthMeasureSpec));
        } else {
            // Subtract the paddings from measure specs.
            childWidthMSpec = MeasureSpec.makeMeasureSpec(
                    Math.max(MeasureSpec.getSize(widthMeasureSpec) - horzPadding, 0),
                    MeasureSpec.getMode(widthMeasureSpec));
            childHeightMSpec = MeasureSpec.makeMeasureSpec(
                    Math.max(MeasureSpec.getSize(heightMeasureSpec) - vertPadding, 0),
                    MeasureSpec.getMode(heightMeasureSpec));
        }

        int maxChildWidth = 0, maxChildHeight = 0;
        int childCount = getChildCount();
        for (int i = 0; i < childCount; ++i) {
            View child = getChildAt(i);
            child.measure(childWidthMSpec, childHeightMSpec);
            maxChildWidth = Math.max(maxChildWidth, child.getMeasuredWidth());
            maxChildHeight = Math.max(maxChildHeight, child.getMeasuredHeight());
        }

        if (isChildRotated()) {
            setMeasuredDimension(maxChildHeight + horzPadding, maxChildWidth + vertPadding);
        } else {
            setMeasuredDimension(maxChildWidth + horzPadding, maxChildHeight + vertPadding);
        }
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        if (changed || mRotationChanged) {
            int width = right - left;
            int height = bottom - top;

            switch (Rotation.normalize(mRotation, this)) {
                default:
                case Rotation.NONE:
                    mChildLayoutRect.set(getPaddingLeft(), getPaddingTop(),
                            width - getPaddingRight(), height - getPaddingBottom());
                    mEventTransformMatrix.reset();
                    mDrawTransformMatrix.reset();
                    break;

                case Rotation.CLOCKWISE:
                    mChildLayoutRect.set(getPaddingTop(), getPaddingRight(),
                            height - getPaddingBottom(), width - getPaddingLeft());
                    mEventTransformMatrix.setRotate(-90);
                    mEventTransformMatrix.postTranslate(0, width);
                    mEventTransformMatrix.invert(mDrawTransformMatrix);
                    break;

                case Rotation.COUNTER_CLOCKWISE:
                    mChildLayoutRect.set(getPaddingBottom(), getPaddingLeft(),
                            height - getPaddingTop(), width - getPaddingRight());
                    mEventTransformMatrix.setRotate(90);
                    mEventTransformMatrix.postTranslate(height, 0);
                    mEventTransformMatrix.invert(mDrawTransformMatrix);
                    break;
            }
            mRotationChanged = true;
        }

        int childCount = getChildCount();
        for (int i = 0; i < childCount; ++i) {
            View child = getChildAt(i);
            child.layout(mChildLayoutRect.left, mChildLayoutRect.top, mChildLayoutRect.right,
                    mChildLayoutRect.bottom);
        }
    }

可以看到其中的onMesure()和onLayout()方法会根据旋转方向进行测量和摆放.

CMake Error at /Users/fym/Library/Application Support/JetBrains/Toolbox/apps/CLion/ch-0/232.8453.115/CLion 2023.2 EAP.app/Contents/bin/cmake/mac/share/cmake-3.26/Modules/CMakeTestCXXCompiler.cmake:60 (message): The C++ compiler "/usr/local/bin/g++-13" is not able to compile a simple test program. It fails with the following output: Change Dir: /Users/fym/Desktop/C++/cmake-build-debug/CMakeFiles/CMakeScratch/TryCompile-FQ7Av9 Run Build Command(s):/Users/fym/Library/Application Support/JetBrains/Toolbox/apps/CLion/ch-0/232.8453.115/CLion 2023.2 EAP.app/Contents/bin/ninja/mac/ninja -v cmTC_c8b71 && [1/2] /usr/local/bin/g++-13 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -fdiagnostics-color=always -o CMakeFiles/cmTC_c8b71.dir/testCXXCompiler.cxx.o -c /Users/fym/Desktop/C++/cmake-build-debug/CMakeFiles/CMakeScratch/TryCompile-FQ7Av9/testCXXCompiler.cxx [2/2] : && /usr/local/bin/g++-13 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_c8b71.dir/testCXXCompiler.cxx.o -o cmTC_c8b71 && : FAILED: cmTC_c8b71 : && /usr/local/bin/g++-13 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_c8b71.dir/testCXXCompiler.cxx.o -o cmTC_c8b71 && : ld: unsupported tapi file type '!tapi-tbd' in YAML file '/Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk/usr/lib/libSystem.tbd' for architecture x86_64 collect2: error: ld returned 1 exit status ninja: build stopped: subcommand failed. CMake will not be able to correctly generate this project. Call Stack (most recent call first): CMakeLists.txt:2 (project) -- Configuring incomplete, errors occurred!
07-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值