0

自動サイズ変更ボタン (ラベルの長さに基づく) に、キーボードまたはコントローラーのフォーカス用のフォーカス インジケーター グラフィックが必要な UI プロジェクトに取り組んでいます。ご想像のとおり、このグラフィックは明らかに親に合わせてスケーリングする必要があります。

これにより問題が発生します。親クリップは 9 スライスされ、そのスライスはこのクリップの子スプライト/ムービークリップには適用されません。フォーカス インジケーターは、オンまたはオフにできる必要があるため、アクセス可能なプロパティである必要があります。

現在、私がイメージできる唯一の解決策は、scale9Grid を非常にプログラム的に再実装することです。ここでは、フォーカス インジケーターを 9 つに分割し、親の幅/高さ/scaleX/scaleY が変更されるたびに 9 つの部分のプロパティを変更します。これは、そのボタンがフォーカスされているときに、9 つのパーツすべてをオンまたはオフにすることも意味します。

それよりも良い方法はありますか?

4

1 に答える 1

1

メソッド(スキンはライブラリからのもの)とオーバーライドされたセッターを使用して、いくつかのラッパークラスを作成することをお勧めしますAppButton(または、ラベル機能によるサイズ変更があるため、すでに持っている可能性があります)。これにより、ここでスキンのサイズ変更ロジックを実装できます幅または高さが変更されるたびに呼び出されるメソッド。setSkin(skin:MovieClip)MovieClipwidthheightarrange()

スキンは複雑になる可能性があります-子の他のムービークリップ(あなたのケースではフォーカスボーダー)を使用するため、穴のスキンに scale9Grid を使用しないarrangeください。それ:

private function arrange():void
{
    var child:DisplayObject;
    for(var i:int = 0; i < numChildren; i++)
    {
        child = getChildAt(i);
        child.width = width;
        child.height = height;
    }
}

プロジェクト内のボタン スキン用に 1 つのスキン フォーマットを作成することも価値があるため、すべてのボタンに対して 1 つのラッパーを使用できます。

後でこれにさらに機能を追加することができますAppButton- マウスイベントでの表示状態の切り替え、テキストラベルの設定、スキンのアニメーション化など。

このアプローチは私にとって何年もの間有効で、ベースToggleButtonLabelButton extends ToggleButtonクラスがあり、カスタム スキンの解析と配置を使用してすべてのプロジェクトでそれらを拡張しています。

于 2013-09-30T11:49:18.373 に答える