0

私は現在、iPad 用のグラフィック デザイン プログラムに取り組んでおり、textField をタッチ イベントで使用する際に少し問題が発生しました。

アンチエイリアスを無効にできる唯一のテキスト オブジェクトであるため、textField オブジェクトを使用して画面にテキストを表示する必要があります。(Spark でそれを行う方法を知っていれば、私の人生は大きく変わるでしょう。)

私の問題の範囲は次のとおりです。

エンド ユーザーが画面に追加するすべてのオブジェクト (テキスト、画像) を含むスパーク グループがあります。

追加された画像は spark:Image 追加されたテキストは flash.text.textField です

UIComponent で textField をラップしてから、containingGroup.addElement(UIComponent)

私が動くようになるまで、すべてが本当にうまく機能します。

オブジェクトを保持するためにビューを使用しています。

私は、Begin、Move、End、および Touch_Out イベントを追加した touchPlatform というスパーク ラベルを作成しました。これを行ったのは、画面に追加する各オブジェクトにイベント リスナーを追加する必要がないようにするためです (パフォーマンス ヒット)。以下は、基本的な MXML セットアップです。

<View>
  <ContainerGroup/>
  <TouchPlatform/>
</View>

TouchPlatform に対して何かを行うたびに、それらの変更を選択したオブジェクトにミラーリングします (ユーザーは、選択できる画面上のオブジェクトのリストを持っています)。

問題まで:

textFields がタッチ イベントに正しく反応していないようです (これらは古いコンポーネントなので驚くことではありません)。画面上で指をドラッグすると、textField に到達するまですべてが正常に機能します。テキスト フィールドに出入りすると、touch_out イベントがスローされます。

これが発生してはならない理由:

  1. touchPlatform に触れています (より高く、画面全体を占有します)
  2. ハンドラーは、textFields 自体ではなく、touchPlatform にのみ存在します。
  3. 発生したイベントは、e.target または e.currentTarget が touchPlatform 以外のものであることを決して教えてくれません。正確なオブジェクトを要求する特定のテストを行っているか、オブジェクトが textField/label/image/other であるかどうかを確認しています。

それが私の大きな懸念事項です。ターゲットとして textField オブジェクトを受け取る touch_out イベントを受け取ることができれば、単純にそれを無視できます。この場合、戻り値は可能な限り有効です。イベントが touchPlatform によってトリガーされたと表示されます。

textField.selectable = false を設定しました。

この問題の手がかりと思われる問題に気付きました。GUI コンポーネントが画面に追加されると (Spark:TextInput としましょう)、skinClass をモバイル バージョンに設定しない限り、それが enabled=false に設定されていて、そのコンテナーが無効になっている場合でも、選択および編集可能です。 、グループとラベルがオーバーレイされているなどです。表示されている場合は、操作できます。モバイルスキンに設定した瞬間、すべてが機能し始めます。このフラッシュ コンポーネントが同様の方法でタッチ イベントを妨害しているかどうか疑問に思っています。

誰かがこの状況の解決策を知っていれば、私はそれを大いに感謝します.

誰かがこのタスクを達成するための別の簡単な解決策を持っている場合は、私にも知らせてください. 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 コンポーネントとうまく連携できないことに注意してください。

上記のコードでわかるように、タッチ エリアとしてスパーク ラベルを使用していました。タッチ エリアの下のグループ内の textFields がスパーク ラベルを通過し、touch_out イベントを発生させていました。

全員が同じルールでプレイすることで、これを解決しました。スパーク ラベルとフラッシュ テキスト フィールドを混在させる代わりに、タッチ エリアをスパーク ラベルからテキスト フィールドに変更しました。

actionscript でテキスト フィールドを作成し、x、y、幅、高さ、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 に答える