You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过用户脚本持久化App Inventor可滚动SVG的修改视图?

解决App Inventor中Blockly SVG视图修改后自动复位的问题

问题核心

直接修改blocklyBlockCanvas/blocklyBubbleCanvas的transform属性,或手动调整网格pattern的x/y值,只是临时改变DOM表现——Blockly内部通过scrollX/scrollY变量维护视图状态,在点击、滚动等交互触发时,会自动重置DOM属性覆盖你的手动修改。

可行解决方案

要持久化视图修改,必须直接操作Blockly工作区的核心状态,而非仅修改DOM:

1. 获取Blockly工作区实例

App Inventor中,Blockly主工作区可直接通过全局变量访问:

const workspace = Blockly.mainWorkspace;

2. 用官方API设置滚动位置

使用Blockly提供的scroll方法,直接修改工作区的滚动状态,这会自动同步DOM和网格pattern的位置:

// 替换number1/number2为你需要的滚动偏移值
workspace.scroll(number1, number2);

3. 强制锁定滚动状态(防止复位)

若仍出现交互后复位的情况,可重写工作区的视图更新方法,强制使用自定义的滚动值:

// 保存原始的视图更新方法
const originalTranslate = workspace.translate_;
// 重写方法,固定使用自定义滚动位置
workspace.translate_ = function(x, y) {
  // 替换为你需要持久化的滚动偏移
  originalTranslate.call(this, yourCustomScrollX, yourCustomScrollY);
};

4. 替代方案:拦截滚动事件

如果需要阻止用户手动滚动干扰自定义视图,可监听并阻止工作区的滚动事件:

workspace.addEventListener('scroll', (e) => {
  e.preventDefault();
  e.stopPropagation();
});

完整脚本示例

window.addEventListener('load', () => {
  const workspace = Blockly.mainWorkspace;
  // 自定义滚动偏移值
  const targetScrollX = 1356.7352240258992;
  const targetScrollY = -128.4999999999999;

  // 初始化设置滚动位置
  workspace.scroll(targetScrollX, targetScrollY);

  // 锁定视图,防止交互复位
  const originalTranslate = workspace.translate_;
  workspace.translate_ = function(x, y) {
    originalTranslate.call(this, targetScrollX, targetScrollY);
  };
});

内容的提问来源于stack exchange,提问作者MagTun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:20:50