0

我目前正在为 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 事件。

不应发生这种情况的原因:

  1. 我正在触摸 touchPlatform(它更高,它占据了整个屏幕)
  2. 处理程序仅在 touchPlatform 上,而不在 textFields 本身上
  3. 触发的事件从不告诉我 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(); 

            }
4

1 回答 1

0

我找到了解决方案。对于遇到相同问题的任何人,请注意旧的 flash 组件并不完全喜欢与 spark 组件配合使用。

正如您在上面的代码中看到的那样,我使用火花标签作为我的触摸区域。触摸区域下方组中的文本字段正在推动火花标签并导致触发 touch_out 事件。

我通过让每个人都按照相同的规则玩来解决这个问题。我没有混合使用 spark 标签和 flash textField,而是将触摸区域从 Spark Label 更改为 Text Field。

我在 actionscript 中创建文本字段,设置它的 x、y、width、height 和 selectable=false。然后将 textField 添加到 UIComponent,然后将 UIComponent 添加到与之前相同的组中。

据我所知,一切运行良好。

下面是我的代码。如果有人有任何问题,请告诉我。

触控平台创建:

if(grpContainer.containsElement(touchPlatformContainer))
                    grpContainer.removeElement(touchPlatformContainer);
                touchPlatform = new TextField();
                touchPlatform.selectable = false;
                touchPlatform.width = 1152;
                touchPlatform.height = 600;
                touchPlatform.x = 0;
                touchPlatform.y - 0;
                touchPlatformContainer = new UIComponent;
                touchPlatformContainer.addChild(touchPlatform);
                grpContainer.addElement(touchPlatformContainer);

与以前相同的触摸事件分配:

touchPlatform.removeEventListener(TouchEvent.TOUCH_BEGIN, m_controlPanel.handleTouchBegin);
                touchPlatform.removeEventListener(TouchEvent.TOUCH_MOVE, m_controlPanel.handleTouchMove);
                touchPlatform.removeEventListener(TouchEvent.TOUCH_END, m_controlPanel.handleTouchEnd);
                touchPlatform.removeEventListener(TouchEvent.TOUCH_OUT, m_controlPanel.handleTouchEnd);


                touchPlatform.addEventListener(TouchEvent.TOUCH_BEGIN, m_controlPanel.handleTouchBegin);
                touchPlatform.addEventListener(TouchEvent.TOUCH_MOVE, m_controlPanel.handleTouchMove);
                touchPlatform.addEventListener(TouchEvent.TOUCH_END, m_controlPanel.handleTouchEnd);
                touchPlatform.addEventListener(TouchEvent.TOUCH_OUT, m_controlPanel.handleTouchEnd);
于 2013-09-08T19:17:23.413 回答