制作嵌套在其他显示对象中的显示对象的视觉克隆,并将克隆添加到相同位置、旋转等的舞台层中

2024-01-01

我希望能够获取嵌套在其他对象中的 DisplayObject 的副本转变的DisplayObjects(旋转、缩放、拉伸的对象),并能够将其标记回相同的视觉位置,但在舞台层上。本质上,能够创建嵌套 DisplayObject 的克隆,但能够将克隆添加到舞台层,同时使其与原始对象完美对齐(视觉上)(相同的位置、比例、旋转)

我一直在从事以下工作:

// draw the pixels of a displayobject into a new bitmap object
var bitmapData:BitmapData = new BitmapData(nestedSprite.width, nestedSprite.height, true, 0xFFFFFF);
var bitmap:Bitmap = new Bitmap(bitmapData);
bitmapData.draw(nestedSprite);

// put the copy on the top most layer
stage.addChild(bitmap);

// position the copy to perfectly overlay the original, but on the top stage layer
var point:Point = nestedSprite.localToGlobal(new Point(0, 0));
bitmap.x = point.x;
bitmap.y = point.y;

但这仅适用于其父对象未转换的显示对象;对于完全位于(0,0)起源。对于居中对齐的对象或缩放的父对象等,它会崩溃。

我知道我可以添加一个矩阵参数.draw()方法,以及剪切矩形,然后缩放我的位图,或者将一个对象的变换设置为另一个对象,或者使用.transform.concatenatedMatrix,或使用nestedObject.getBounds(null), or nestedSprite.getBounds(nestedSprite)等等,但不幸的是我陷入了这样做试错编程就这一点而言,并且存在许多变量,这绝不是解决编程问题的好方法。


我相信这个函数应该可以工作,唯一的额外步骤是偏移连接矩阵,以便目标将在位图上的左上角 (0, 0) 处绘制,即使它的原点在其他地方。希望其余的内容是不言自明的,但如果有任何不合理的地方,我可以添加更多评论。

function createBitmapClone(target:DisplayObject):Bitmap {
    var targetTransform:Matrix = target.transform.concatenatedMatrix;
    var targetGlobalBounds:Rectangle = target.getBounds(target.stage);
    var targetGlobalPos:Point = target.localToGlobal(new Point());

    // Calculate difference between target origin and top left.
    var targetOriginOffset:Point = new Point(targetGlobalPos.x - targetGlobalBounds.left, targetGlobalPos.y - targetGlobalBounds.top);

    // Move transform matrix so that top left of target will be at (0, 0).
    targetTransform.tx = targetOriginOffset.x;
    targetTransform.ty = targetOriginOffset.y;

    var cloneData:BitmapData = new BitmapData(targetGlobalBounds.width, targetGlobalBounds.height, true, 0x00000000);
    cloneData.draw(target, targetTransform);
    var clone:Bitmap = new Bitmap(cloneData);

    // Move clone to target's global position, minus the origin offset.
    clone.x = targetGlobalPos.x - targetOriginOffset.x;
    clone.y = targetGlobalPos.y - targetOriginOffset.y;

    return clone;
}

不幸的是,如果 DisplayObjects 上有任何过滤器,pixelBounds 似乎会返回 (0, 0) 的原点,这显然会破坏事物。

Edit:已更换target.transform.pixelBounds with target.getBounds(target.stage)作为一个轻微的改进。如果有过滤器,这可以保持位置正确,但是父 DisplayObject 上的过滤器仍然不会被包含在内, and 目标上的滤镜可以与位图的边缘重叠。我不确定是否有一种简单的方法可以解决这个问题。

Update:Jimmi Heiserman 发现如果缩放 swf,此功能就会被破坏。没有stage.scaleMode = StageScaleMode.NO_SCALE;不过,stageWidth and stageHeight参数似乎保持不变,所以我发现的唯一(相当hacky)的解决方法是添加一个“未缩放的”测试精灵并使用its concatenatedMatrix调整克隆的位置和比例:

function createScaledBitmapClone(target:DisplayObject):Bitmap {
    var targetTransform:Matrix = target.transform.concatenatedMatrix;
    var targetGlobalBounds:Rectangle = target.getBounds(target.stage);
    var targetGlobalPos:Point = target.localToGlobal(new Point());

    // Calculate difference between target origin and top left.
    var targetOriginOffset:Point = new Point(targetGlobalPos.x - targetGlobalBounds.left, targetGlobalPos.y - targetGlobalBounds.top);

    // Create a test Sprite to check if the stage is scaled.
    var testSprite:Sprite = new Sprite();
    target.stage.addChild(testSprite);
    var testMatrix:Matrix = testSprite.transform.concatenatedMatrix;
    target.stage.removeChild(testSprite);

    // Move transform matrix so that top left of target will be at (0, 0).
    targetTransform.tx = targetOriginOffset.x * testMatrix.a;
    targetTransform.ty = targetOriginOffset.y * testMatrix.d;

    var cloneData:BitmapData = new BitmapData(targetGlobalBounds.width * testMatrix.a, targetGlobalBounds.height * testMatrix.d, true, 0x00000000);
    cloneData.draw(target, targetTransform);
    var clone:Bitmap = new Bitmap(cloneData);

    // Move clone to target's global position, minus the origin offset, and cancel out stage scaling.
    clone.x = targetGlobalPos.x - targetOriginOffset.x;
    clone.y = targetGlobalPos.y - targetOriginOffset.y;
    clone.scaleX = 1 / testMatrix.a;
    clone.scaleY = 1 / testMatrix.d;

    return clone;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

制作嵌套在其他显示对象中的显示对象的视觉克隆,并将克隆添加到相同位置、旋转等的舞台层中 的相关文章

  • 仅在 Windows Chrome 上使用变换比例会导致文本模糊

    我遇到了一个关于 CSS 转换的非常令人沮丧的问题scale 我有一个文本块 我想在悬停时将其缩放 105 但它导致文本模糊 但仅限于 Windows 版本的 Chrome 我发现这个问题 https stackoverflow com q
  • 为什么 import numpy 不会自动包含 matlib

    我正在尝试使用水平重复 numpy array xa numpy matlib repmat x 1 3 但是 直接输入此内容会导致错误 我必须添加import numpy matlib为了a numpy matlib repmat x 1
  • 如何识别数据集中其他列之和的列

    我想编写一个函数 最好用 R 语言 但也欢迎其他语言 它可以识别数据集中列之间的关系 仅限于加法 减法 其实际应用是在大型多列财务数据集上运行它 其中某些列是其他列的小计 并识别此类小计 理想情况下 我希望允许一些小的差异 例如允许舍入问题
  • (简单)Flex 3 应用程序需要什么版本的 Flash 播放器?

    Flex 3 应用程序需要什么版本的 Flash 播放器 要求似乎是FLEX开发环境中的HTML WRAPPER ACTIONSCRIPT编译器设置 我可以在那里选择什么来最大程度地兼容旧的 Flash 播放器 v8 播放器可以工作吗 Fl
  • python中的张量点运算

    我有两个数组A 1 2 3 and B 1 0 1 0 问题是如何在 python 中执行张量点积 我期待得到 C 1 2 3 0 0 0 1 2 3 0 0 0 函数 np tensordot 返回有关数组形状的错误 对这个问题稍微补充一
  • 如何从一个清晰的例子计算二维图像中的吉布斯能量

    我有一个关于矩阵的有趣问题 在吉布斯分布中 吉布斯能量U x 可以计算为 这是所有可能的派系 C 上的派系势 Vc x 的总和 右图 团 c 被定义为 S 中站点的子集 x 蓝色像素的邻域是左图中黄色像素的邻居 其中每对不同的站点都是邻居
  • Chrome 通知/权限栏 - 检测是否可见

    当 Flash 请求访问相机或麦克风时 Chrome 会显示以下通知栏 有没有 JavaScript 或 AS3 方法可以检测它是否可见 我知道你问这个问题已经很长时间了 但我们终于找到了一个我想分享的解决方法 ActionScript C
  • 如何判断一个字符串是否包含特定子串

    给定一个字符串A 如何确定该字符串是否包含子字符串 video x flv A indexOf video x flv gt 0
  • 是否可以将 BitmapDescriptor 转换为 Bitmap?

    我需要将 BitmapDescriptor 转换为 Bitmap 我可以使用以下代码将位图转换为 BitmapDescriptor BitmapDescriptor bd BitmapDescriptorFactory fromBitmap
  • 使用“const cv::Mat &”、“cv::Mat &”、“cv::Mat”或“const cv::Mat”作为函数参数的区别?

    我已经彻底搜索过 但没有找到一个简单的答案 传递 opencv 矩阵 cv Mat 作为函数的参数 我们传递一个智能指针 我们对函数内部的输入矩阵所做的任何更改也会改变函数范围之外的矩阵 我读到 通过将矩阵作为 const 引用传递 它不会
  • 不可变位图崩溃错误

    java lang IllegalStateException Immutable bitmap passed to Canvas constructor at android graphics Canvas
  • 绘制大位图时 nSyncAndDrawFrame 速度极慢

    我想用多个大位图优化视差滚动视图 在我的 Nexus 5 上 一切都很顺利 Traceview 转储如下所示 doFrame 方法大约需要 18 毫秒才能完成 但是 当使用我的 Nexus 7 或 Android 6 模拟器 Genymot
  • 3D 透视投影的剪辑矩阵

    我正在尝试创建一个简单的 3D 图形引擎 并找到并使用了我在这里找到的方程 http en wikipedia org wiki 3D projection cite note 0 http en wikipedia org wiki 3D
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • 使用 numpy tensordot 进行张量乘法

    我有一个张量 U 由 n 个维度 d k 的矩阵和一个维度 k n 的矩阵 V 组成 我想将它们相乘 以便结果返回一个维度为 d n 的矩阵 其中 j 列是 U 的矩阵 j 与 V 的 j 列之间的矩阵乘法的结果 获得此信息的一种可能方法是
  • 将 String 转换为 byte,然后转换为 int

    我发现了很多关于这个主题的问题 但我无法解决我的问题 用户将输入一个名字String我需要将其转换为List
  • MATLAB 中最有效的矩阵求逆

    在 MATLAB 中计算某个方阵 A 的逆矩阵时 使用 Ai inv A should be the same as Ai A 1 MATLAB 通常会通知我这不是最有效的求逆方法 那么什么是更有效率的呢 如果我有一个方程系统 可能会使用
  • 在 Flex 中隐藏右键单击上下文菜单中的默认选项

    我正在开发一个 Flex 应用程序 我想为其添加一个上下文菜单 我用这段代码得到了它 var myMenu ContextMenu new ContextMenu myMenu hideBuiltInItems var defaultIte
  • Javascript 通过ExternalInterface 来刷新

    我想知道是否有人可以查看我的代码 我正在尝试使用以下代码将虚拟变量从 javascript 传递到 actionscript 3 HTML
  • Python矩阵问题[重复]

    这个问题在这里已经有答案了 这是从这个线程继续的 Python矩阵 有什么解决方案吗 https stackoverflow com questions 5835583 python matrix any solution Input fr

随机推荐

  • 无需 for 循环即可标记连续的观察块

    我有一个标准的 我可以避免循环 问题 但找不到解决方案 我回答了这个问题由 splaisan提出 https stackoverflow com questions 10532192 add segments to scatter plot
  • 尝试发送基本的 Nodemailer 电子邮件

    我正在尝试将一些带有硬编码电子邮件数据的测试代码直接插入到我的 nodemailer server js 文件中 以开始基本的工作示例 请参阅以下网址中的 测试代码 部分 http jsbin com sibubi 1 edit html
  • 使用 Qt5 截取完整桌面的屏幕截图

    我今天想出了如何使用 Qt5 从包含的示例中获取桌面屏幕截图 该示例获取主屏幕 抓取它 然后保存它 我正在从 Python 翻译代码而不进行测试 所以如果有一个小的语法错误 那么是的 你知道 因此 我可以轻松地使用以下命令截取主屏幕的屏幕截
  • 错误:“uint8_t”尚未声明[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在尝试在 openSUSE 11 2 中使用 xbox360 控制器作为操纵杆 尝试编译 xboxdrv 时 htt
  • Firefox Webdriver 非常慢

    我们使用设置的 selenium webdriver dll 来运行我的自动化套件 我仅在 Firefox 中运行测试时遇到此问题 Firefox 中的测试运行速度非常慢 加载页面需要 3 4 分钟 但是 当我使用 Firefox 浏览器在
  • React Native fetch() 网络请求失败

    当我使用创建一个全新的项目时react native init RN 版本 0 29 1 并将 fetch 放入公共 facebook demo movie API 的 render 方法中 它会抛出Network Request Fail
  • django 中不同用户类型的单独“管理”界面

    我最近正在尝试创建一个涉及多个级别用户的项目 只是一个缩写和粗略模式的示例 ME Super User Client s Customer s Survey Collections SurveyUser s Invitee s Survey
  • 如何在纵向数据集中进行缩尾(或删除单变量异常值)

    我试图弄清楚如何对纵向数据集中按个体分组的观察结果进行缩尾处理 我从这个开始很好的答案 https stackoverflow com questions 14596373 removing univariate outliers from
  • Ionic 启动画面中的 GIF 文件

    我正在开发一个带有 ionic framework 和 Cordova 插件的混合应用程序 他们问我两个操作系统 iOS 和 Android 上的启动屏幕都有一个小动画 我想象的是 GIF 但如果您可以将 GIF 作为启动屏幕加载 则不会
  • 如何删除 Xamarin.Forms 导航栏?

    有没有办法从 Android 中的 Xamarin Forms Portable xaml 中删除导航栏 我想删除 Xamarin Forms xaml 内容页面上方显示的 小于号 您可以使用以下代码使用 Xamarin Forms 从 X
  • 尝试添加一对多关系时出现 NullReferenceException

    Item可以包含多个Sizes 当我尝试为我的商品添加新尺寸时 它会抛出NullReference错误 当我尝试将图像添加到我的项目时 也会发生同样的情况 你调用的对象是空的 Code var size new Size BasePrice
  • 在 C++ (Win32) 中解析 XML 的方法

    我正在寻找一种在 Windows 中用 C 解析 XML 的方法 我发现了一些方法 例如 MSXML Xerces TinyXml 等 但我想知道哪种方法在性能和功能方面最好 我的要求是它必须能够静态链接或将源代码包含在项目本身中 并且不能
  • Visual Studio 中的国际化

    我对 Visual Studio 相当陌生 想知道如何在我正在启动的新项目中最好地规划翻译 我需要提供英语 德语和法语 我过去经常使用 Eclipse 在那里我刚刚开发了一个新应用程序 当它完成时 我可以启动一个向导将字符串外部化到资源文件
  • Jackson 无法序列化我的领域对象

    我有一个 Route 对象 但我发现无法序列化它 所以我说我将调试并尝试单独序列化其中的对象 这是我的功能 public JSONObject getRouteJson Next Step step JSONObject route new
  • 在模板类中调用模板方法

    我试图找出为什么我无法编译的一些代码 并且我做了相当多的减少和匿名化 最终得到了这个例子 define NULL void 0 template
  • GWT UiBinder 有什么方法可以拥有动态的小部件列表吗?

    Class Foo有一个变量List
  • JavaScript 对数组进行排序

    我的数组未正确排序 有人可以让我知道我做错了什么吗 sortArray new Array hello Link to Google zFile aFile sort array if dir asc sortArray sort func
  • 找到顶点的边(多边形)的最佳算法

    我有大量的顶点 其中一些是边缘 一些是多余的 形状内部 我想删除它们 我能想到的最简单的算法是一一检查它们是否撞到了其他人形成的形状 但这应该是一个非常慢的算法 我考虑从边缘选择一个 每个示例中距原点最远的一个 并计算从这一点开始的最长路径
  • 为什么Python在for和while循环之后使用'else'?

    我理解这个结构是如何工作的 for i in range 10 print i if i 9 print Too big I m giving up break else print Completed successfully 但我不明白
  • 制作嵌套在其他显示对象中的显示对象的视觉克隆,并将克隆添加到相同位置、旋转等的舞台层中

    我希望能够获取嵌套在其他对象中的 DisplayObject 的副本转变的DisplayObjects 旋转 缩放 拉伸的对象 并能够将其标记回相同的视觉位置 但在舞台层上 本质上 能够创建嵌套 DisplayObject 的克隆 但能够将