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

时间:2018-01-05 18:29:42

标签: android actionscript-3 air 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事件,而不是buttonClick事件。

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

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

非常感谢任何帮助。

编辑:

我找到了scrollRect正常工作的实例,因此进行了进一步的测试以缩小bug。

删除该行:

outer.cacheAsBitmap = true;

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

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

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

1 个答案:

答案 0 :(得分: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的速度运行,毫无汗水。