使用AS3的TouchEvent
处理多点触控时,我遇到了奇怪的行为。在某些情况下,触摸会明显滞后,但是Flash的帧频不会受到影响。好像触摸被缓冲了,事件直到触摸后几秒钟才被调度。
我在此处上传了一个演示:https://youtu.be/omkCDqljfio
我仅设法在Flash Player的ActiveX版本中重现了这种触摸滞后,但在Windows 10和Windows 7中均已重现了它。因此,我在这里拥有一个托管AS3测试套件的C#应用程序,但是如果在Internet Explorer中查看swf,也可以观察到。
由于我的应用程序已经涉及到在WPF窗口中托管SWF,因此我一直在尝试创建一种解决方案,其中在C#中接收触摸,然后将其传达给AS3。它将正常工作,但是当触摸在WindowsFormsHost
上时,我的WPF窗口似乎没有接收触摸框。因此,还有一个我必须解决的问题。
FlashDevelop项目:https://drive.google.com/file/d/0BxC2eCzurT9rd0gzSGc4TUdQLTQ/view
Visual Studio解决方案:https://drive.google.com/file/d/0BxC2eCzurT9rUThmRHBKWHZmbzA/view
AS3触摸事件:
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
stage.addEventListener(TouchEvent.TOUCH_BEGIN, stage_touchBegin);
stage.addEventListener(TouchEvent.TOUCH_MOVE, stage_touchMove);
stage.addEventListener(TouchEvent.TOUCH_END, stage_touchEnd);
创建可能导致延迟的显示对象,大概是因为触摸事件捕获阶段:
for (var i:int = 0; i < 500; i++)
{
Dotter.createBGDot(_bgLayer, _shapesOn ? Shape : Sprite);
}
...
static public function createBGDot(bgLayer:Sprite, dotClass:Class):void
{
var dot:* = new dotClass();
var color:Color = new Color();
color.brightness = Math.random();
dot.graphics.beginFill(color.color);
dot.graphics.drawCircle(0, 0, Math.random() * 400 + 40);
dot.x = Math.random() * bgLayer.stage.stageWidth;
dot.y = Math.random() * bgLayer.stage.stageHeight;
bgLayer.addChild(dot);
}
我知道这是一种不寻常的情况,但是对于任何有关解决这些问题的建议,我深表感谢。
最佳答案
现在,我已经使用了Adobe Scout,我认为这毕竟是一个渲染问题。帧频仍显示为30fps,因为处理时间几乎无法达到30fps。降低帧频可解决此问题。
但是,当帧速刚好不足时,触摸事件就会有这么长的延迟,这仍然很奇怪。