【问题标题】:Objects Hidden Using ScrollRect Blocking/Triggering Input Events使用 ScrollRect 阻止/触发输入事件隐藏的对象
【发布时间】:2018-01-05 18:29:42
【问题描述】:

该项目是用 as3 编写的,使用 AIR 28.0 打包,并在 Android 7 设备上运行(在 windows 桌面环境下运行时运行良好)。

在我的 Android 7 (S7) 上,被 scrollRect 隐藏的对象仍在接收鼠标事件,但当我在桌面环境中运行相同的应用程序时却没有。

这是 Android 或 AIR 错误吗?还是我做错了什么?

例子:

EDIT: (Original code example was incomplete see edit below)
var button:Sprite = new Sprite();
button.graphics.beginFill(0x00FF11, 1);
button.graphics.drawRect(0, 0, 50, 50);
button.graphics.endFill();
addChild(button);

button.addEventListener(MouseEvent.CLICK, buttonClick);

var outer:Sprite = new Sprite();
var square:Sprite = new Sprite();
outer.cacheAsBitmap = true;
outer.addChild(square);
var rect:Rectangle = new Rectangle(0, 0, 50, 50);
outer.scrollRect = rect;
addChild(outer);
outer.y = 50;

square.graphics.lineStyle();
square.graphics.beginFill(0x000000, 1);
square.graphics.drawRect(0, 0, 100, 100);
square.graphics.endFill();

square.addEventListener(MouseEvent.MOUSE_DOWN, squareDown);
square.y = -50;

在本例中,在内部对象中绘制的矩形仅在 outer.scrollRect 内可见(因此是 50x50 而不是 100x100),并且按钮对象在其上方可见。当可见按钮上发生单击事件时,将触发 innerClick 事件,而不是 buttonClick 事件。

似乎内部容器的不可见部分,被应用的 scrollRect 隐藏,只是在视觉上隐藏并且仍然阻塞输入事件。

正在通过我的 IDE (Flash Builder) 编译和安装该应用程序。我尝试了不同版本的 IDE 和 AIR SDK,结果相同。

任何帮助将不胜感激。

编辑:

我发现了 scrollRect 工作正常的实例,因此进一步测试以缩小错误范围。

删除线:

outer.cacheAsBitmap = true;

... 解决了这个问题。将 cacheAsBitmap 应用于方形对象本身也仍然可以正常工作。

由于某种原因,将 cacheAsBitmap 应用于具有 scrollRect 的对象会导致此错误,但将 cacheAsBitmap 应用于更进一步的子对象可以正常工作。

我没有足够的经验来了解性能影响或为什么建议使用 scrollRect 将 cacheAsBitmap 添加到对象。也许其他人可以通知。

【问题讨论】:

  • 如果它在实际 Android 设备上的工作方式不同(在仿真模式下检查,无法重现),那么它显然是一个错误。因此,现在您可以 a) 尝试矩形蒙版,然后 b) 忘记常规 Flash 内容,因为无论如何它在 Android 上运行速度太慢并切换到 Starling。
  • 我的原始代码示例缺少关键行。道歉组织。但是,我能够缩小导致错误的原因并进行编辑以包含该信息。

标签: android actionscript-3 air scrollrect


【解决方案1】:

scrollRect 属性可能是使用矩形遮罩剪切某些内容的最符合性能的方式(使用常规 Flash 内容)。

cacheAsBitmap 属性可以让 Flash Player 无需渲染对象的内容,除非对象内部发生了变化。

简单地说。想象一页插图丰富的童话书:一张过于复杂的矢量图片,有很多细节,一些带有花哨字体的文本等。你把它放在舞台上,Flash Player 需要渲染所有这些:矢量填充和笔触,花哨的字体.然后,在几帧的过程中你不需要改变任何东西,Flash Player 不需要渲染任何东西,这很好。然后你将这个页面向右移动 1px 并且 - 猜猜 - Flash Player 需要再次渲染整个内容。

该页面下、该页面上方或该页面的任何更改(该页面边界框内的任何更改)都会使 FP 再次呈现该页面的全部内容 - 这将对性能造成相当大的影响。

使用 cacheAsBitmap 允许 FP 仅呈现一次,因此只有对该页面的内部更改才会使 FP 再次呈现它,其他任何事情都会使 FP 只使用缓存版本,即 比一遍又一遍地渲染更快。我同意,这可能是移动设备的解决方案,因为它们速度慢且缺乏 CPU。

因此,如果您的应用具有以下元素:

  • 包含复杂的矢量形状和文本
  • 是静态的或很少变化的
  • 不会太大

然后您可以使用 cacheAsBitmap = true 缓存它们,以牺牲 RAM 来获得一些性能。

但是。

如果您正在构建商店级产品,而不仅仅是学校项目或用于个人娱乐的东西,我建议您查看Gamua Starling,因为您永远无法让您的应用与常规 Flash 内容顺利运行.一旦你需要重新绘制整个屏幕,FPS 就会掉到海底,因为 Flash 需要 CPU,而移动设备则缺乏 CPU。另一方面,Starling 使用 Stage3D 和设备的 GPU 资源,因此您可以毫不费力地以 60 FPS 的速度运行过于丰富的动画。

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2011-10-10
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    相关资源
    最近更新 更多