使用 ScrollRect 阻止/触发输入事件隐藏的对象



该项目是用as3编写的,使用AIR 28.0打包,并在Android 7设备上运行(在Windows桌面环境中运行时,它工作正常)。

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

这是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 事件,而不是按钮单击事件。

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

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

任何帮助将不胜感激。

编辑:

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

删除该行:

outer.cacheAsBitmap = true;

。修复了该问题。将 cacheAsBitmap 应用于方形对象本身也仍然可以正常工作。

出于某种原因,使用 scrollRect 将 cacheAsBitmap 应用于对象会导致此错误,但将 cacheAsBitmap 应用于更远的子对象可以正常工作。

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

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的速度运行过于丰富和动画的东西。

最新更新