1

TextFieldのテキストのセクションに非スタイル属性を適用できるようにしたい。たとえば、キャラクター30〜45は、特定の方向にアニメーション化するように設定されます。

このフィールドは編集可能な文字であるため、テキストが何らかの方法で編集された場合、30〜45文字は30〜45文字ではなくなる可能性があります。

どのキャラクターに属性が適用されているかを追跡するためのエレガントな方法を誰かが考えることができますか?

4

1 に答える 1

3

同様のプロジェクトがあり、必要に応じて TextField クラスを拡張することになりました。これは何をすべきかの簡単な説明です - 私の実際のコードは機密です.

  1. textとのセッターをオーバーライドするhtmlText
  2. これらのセッターからのコンテンツをカスタム オブジェクトの配列に解析します。これらの各オブジェクトには、未加工のテキスト チャンクと、それらに適用されるメタデータ (形式、コメントなど) が含まれています。

    例えば、

    <span class="sometext" animation="true">Info</span> 
    

    次のようなオブジェクトに変換されます。

    { text:"Info", clazz="sometext", animation:true };
    
  3. 実際のテキスト出力は、 を使用appendTextして未加工のテキストのチャンクごとに追加し、 を使用setTextFormatして各追加ステップの後に書式設定を適用する (またはその他の必要なことを行う) ことによってレンダリングされます。
  4. TEXT_INPUT や KEY_DOWN/KEY_UP イベントに反応するイベント リスナーを追加して、新しいユーザー入力をキャッチします。(TextField のテキスト コンテンツ全体を何度も置き換えるため、使用するオプションではありませんsuper.text。)
  5. ユーザー入力は and を使用して処理されselectionBeginIndexますselectionEndIndex(オブジェクト配列の生テキストの文字数を数えて、影響を受けるチャンクを見つけます)。コンテナー オブジェクト内で新しいテキストを直接追加または置換し、手順 3. を使用して TextField 内のテキスト全体を更新します。
  6. また、レンダリングする前に配列を削減するメソッドを追加しました (つまり、隣接するチャンクを同一のメタデータと結合します)。これにより、配列がスリムに保たれ、複雑なツリー構造を持たない XML 出力を作成するのに役立ちます (この種のシナリオでは、1 次元が非常に好まれます)。
  7. 結果が別の場所に必要な場合は、getter をオーバーライドしてtext、新しくフォーマットされた情報を返します。htmlText以前はhtmlText、完全に装飾された xml 文字列を返しtext、生のテキスト コンテンツにアクセスするために保持していました。これは、一般的な TextField と同様です。
于 2012-01-20T19:21:36.170 に答える