我目前正在为 iPad 开发一个图形设计程序,并且在使用带有触摸事件的 textField 时遇到了一个小问题。
我必须使用 textField 对象在屏幕上显示文本,因为它是唯一可以禁用抗锯齿的文本对象。(如果您知道使用 Spark 的方法,那将严重改变我的生活。)
我的问题范围如下:
我有一个火花组,其中包含最终用户添加到屏幕的所有对象(文本、图像)。
添加的图像是 spark:Image 添加的文本是 flash.text.textField
我将 textField 包装在 UIComponent 中,然后包含Group.addElement(UIComponent)
一切都很好,直到我开始运动。
我正在使用视图来保存对象。
我创建了一个名为 touchPlatform 的 spark 标签,向其中添加了 Begin、Move、End 和 Touch_Out 事件。我这样做是为了不必为添加到屏幕的每个对象添加事件侦听器(性能下降)。下面是基本的 MXML 设置:
<View>
<ContainerGroup/>
<TouchPlatform/>
</View>
每当我对 TouchPlatform 做某事时,我都会将这些更改镜像到所选对象(用户在屏幕上可以选择对象列表)。
归根结底:
似乎 textFields 没有正确响应触摸事件(这并不奇怪,因为它们是较旧的组件)。当我在屏幕上拖动手指时,一切正常,直到我点击一个文本字段。当我进入或退出文本字段时,它会引发一个 touch_out 事件。
不应发生这种情况的原因:
- 我正在触摸 touchPlatform(它更高,它占据了整个屏幕)
- 处理程序仅在 touchPlatform 上,而不在 textFields 本身上
- 触发的事件从不告诉我 e.target 或 e.currentTarget 是 touchPlatform 以外的任何东西。我正在做特定的测试,询问确切的对象,或者对象是否“是”文本字段/标签/图像/其他。
这是我的主要关注点。如果我能收到一个 touch_out 事件,我会收到一个 textField 对象作为我的目标,我可以简单地忽略它。在这种情况下,返回尽可能有效;它说该事件是由 touchPlatform 触发的。
我已经设置了 textField.selectable = false。
我一直注意到一个问题,我认为这是解决这个问题的线索。当一个 GUI 组件被添加到屏幕上时(比如 Spark:TextInput),除非我将 skinClass 设置为移动版本,否则即使它已设置为 enable=false,它的容器已被禁用,它仍然是可选择和可编辑的,组和标签已经覆盖了它,等等。如果你能看到它,你就可以与之交互。我将它设置为移动皮肤的那一刻,一切都开始工作了。我想知道这个 Flash 组件是否以类似的方式破坏了触摸事件。
如果有人知道这种情况的解决方案,我将不胜感激。
如果有人有另一种简单的解决方案来完成这项任务,也请告诉我。我需要在星期一完成,也就是 2.5 天。
预先感谢您的帮助
代码:Touch Platform 的创建位置以及它是如何通过 Workbench Container(保存屏幕上所有对象的东西)的:
<s:Group height="600" width="100%" creationComplete="touchPlatform_creationCompleteHandler(event)">
<Components:WorkbenchContainer id="wrkBenchContainer">
</Components:WorkbenchContainer>
<s:VGroup>
<s:HGroup id="grpLoading" visible="{properties.loading}">
<s:BusyIndicator id="bsyLoading" symbolColor="#FFFFFF"/>
<s:Label id="lblLoading" text="Loading..." color="#FFFFFF"/>
</s:HGroup>
</s:VGroup>
<s:Label id="touchPlatform" width="100%" height="100%" creationComplete="touchPlatform_creationCompleteHandler(event)"/>
</s:Group>
附加到 touchPlatform 的 TOUCH_OUT 的事件处理程序结果
public function handleTouchEnd(e:TouchEvent):void{
if(m_layersPanel.lstLayers.selectedIndex == -1)
return;
/*
var stopTouch:Boolean = false;
var reason:String = "";
if(e.stageX > (m_workbenchContainer.width + m_workbenchContainer.x) || e.stageX < 0 || e.stageY < 0 || e.stageY > (m_workbenchContainer.height + m_workbenchContainer.y)){
reason+= "OUT OF BOUNDS X:" + e.stageX + " Y:" + e.stageY + " WX:" + m_workbenchContainer.x + " WY:" + m_workbenchContainer.y + " MaxX:" + m_workbenchContainer.x + m_workbenchContainer.width + " MaxY:" + m_workbenchContainer.y + m_workbenchContainer.height;
stopTouch = true;
}
for(var z:int = 0; z < m_workbench.grpLayers.numElements; z++){
if(e.target == m_workbench.grpLayers.getElementAt(z)){
stopTouch = true;
reason += "TOUCHING OBJECT: " + e.target.toString();
}
}
*/
properties.bounds = "BOUNDS: ID: " + e.touchPointID + " X:" + e.stageX + " Y:" + e.stageY + " WX:" + m_workbenchContainer.x + " WY:" + m_workbenchContainer.y + " MaxX:" + m_workbenchContainer.x + m_workbenchContainer.width + " MaxY:" + m_workbenchContainer.y + m_workbenchContainer.height;
var stopTouch:Boolean = false;
if(e.currentTarget is Label){
reason += "Touched Label";
stopTouch = true;
}else if(e.currentTarget is TextField){
reason += "Touched TextField";
}else{
reason += "Unknown: " + e.currentTarget.toString();
}
if(!(e.currentTarget is Label))
{
properties.status = "TRIP OBJECT: " + e.touchPointID + "- " + reason;
//e.preventDefault();
//e.stopImmediatePropagation();
return;
}else if(e.stageX > (.95 * (m_workbenchContainer.width + m_workbenchContainer.x)) || e.stageX < 10 || e.stageY < 10 || e.stageY > (.95 * (m_workbenchContainer.height + m_workbenchContainer.y))){
properties.status = "OUTSIDE BOUNDS" + reason + e.currentTarget.toString();
}else{
properties.status = "VALID? " + reason + e.currentTarget.toString();
}
/* if(e.target is DoodleText || e.target is DoodleImage)
properties.status = "TOUCHED IMAGE OR TEXT";
else if(e.target is UIComponent){
properties.status = "Touched UI Component";
}else
properties.status = "Out Of Bounds";
else
properties.status = "END TOUCH";
*/
//Primary finger removed
if(primTouchID == e.touchPointID){
primTouchID = -1;
secTouchID = -1;
properties.primaryStatus = "RESET";
properties.secondaryStatus = "RESET";
var obj:DoodleInterface = DoodleInterface(m_layersPanel.lstLayers.selectedItem);
m_undoHandler.addUndo(m_layersPanel.lstLayers.selectedItem,"TRANSFORM",(originalX + "," + originalY + "," + originalWidth + "," + originalHeight), (obj.getActualX() + "," + obj.getActualY() + "," + obj.getActualWidth() + "," + obj.getActualHeight()));
}
//Secondary finger removed
if(secTouchID == e.touchPointID){
secTouchID = -1;
properties.secondaryStatus = "RESET";
}
//Stop Stretching if both primary and secondary fingers have been removed
if(primTouchID == -1 && secTouchID == -1){
stretching = false;
//Ensure Object is Snapped to Grid
var endobj:DoodleInterface = DoodleInterface(m_layersPanel.lstLayers.selectedItem)
endobj.setX(int(endobj.getActualX()));
endobj.setY(int(endobj.getActualY()));
endobj.setWidth(int(endobj.getActualWidth()));
endobj.setHeight(int(endobj.getActualHeight()));
}
m_workbench.refreshSelection();
}