2

代替テキスト

みなさん、こんにちは。XMLファイルからタブ付きナビゲーションを作成しています。ただし、何らかの理由で、ループはアクティブなタブと最後のタブ(この場合は4番目のタブ)のテキストフィールドのみを作成します。

>ここで私のフラッシュをプレビューできます。<(テキストフィールドの境界線をオンにしました)

私の問題:
1。アクティブタブ(明るい色のタブ)は、テキストフィールドの幅に基づいて正しくサイズ設定されません
。2。何らかの理由で、ループは2つの中央のタブをスキップしますが、4番目のタブを正しく設定します。

XMLタブのタイトル:

  • これは最初のタブです
  • 2番目のタブ
  • 3番目のタブ
  • 4番目で最後のタブ

2番目と3番目のタブのサイズは正しく設定されているようですが、以下に示すように、2番目と3番目のタブのテキストをトレースしようとするとエラーが発生します。

♥更新:これが解決されることを期待して、TabMenuクラス全体を追加しました:) これが私の問題の原因であると今では信じています:

// tabNamer creates the active & default textfields
tabNamer(tabNameActive,  Fonts.ActiveTabText,  tabData[0].id); // for ActiveTab
tabNamer(tabNameDefault, Fonts.DefaultTabText, tabData[i].id); // for DefaultTabs

tabNamerはtextFieldのみを含む関数であり、最後に作成されたtextFieldをオーバーライドし続けると思います。これが、4番目で最後のtextFieldのみがテキストを表示する理由です。textFeilds is I loopに動的に名前を付ける方法はありますか?

TabMenu.as(クラス全体)

package com.leongaban.TEN.ui
{
import flash.display.DisplayObject;
import flash.display.LineScaleMode;
import flash.display.JointStyle;
import flash.display.MovieClip;
import flash.display.Graphics;
import flash.display.Sprite;
import flash.display.Shape;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.events.TimerEvent;

import com.leongaban.TEN.ui.*;
import com.leongaban.TEN.Global;
import com.leongaban.TEN.model.*;

public class TabMenu extends Sprite
{

    private const position    :Number    = 0;

    private var tabNameDefault:TextField = new TextField();
    private var tabNameActive :TextField = new TextField();
    private var backing       :Shape     = new Shape();
    private var tabData       :Array     = [];
    private var tabArray      :Array     = [];
    private var bgColor       :uint      = 0xF6F6F6; //0xE8E7E7;
    private var borderColor   :uint      = 0xCCCCCC;
    private var borderSize    :uint      = 1;
    private var sizeW         :uint;
    private var sizeH         :uint;
    private var topShadow     :MovieClip;
    private var tileShadow    :MovieClip;
    private var sideShadowL   :MovieClip;
    private var sideShadowR   :MovieClip;


    public function TabMenu():void
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void {

        removeEventListener(Event.ADDED_TO_STAGE, init);

        addChild(backing);
        addChild(topShadow);
    }

    public function drawTabMenu(w, h, color, videoHDiff, ypos):void
    {           
        for (var i in Global.xml..tab) {
            tabData.push( {
                           id:Global.xml..tab[i].@id, 
                           video:Global.xml..tab[i].vid, 
                           title:Global.xml..tab[i].title} );

            //trace("TAB TITLES: "+tabData[i].id);
        }
        //trace("FIRST TAB DATA : "+tabData[0].id[0]+"\n"+tabData[0].video);

        sizeW = w;
        sizeH = h;

        topShadow = new EmptyMov();
        tileShadow = new TileShadow();
        sideShadowL = new SideShadowL();
        sideShadowR = new SideShadowR();
        sideShadowR.x = (sizeW-16) - sideShadowR.width;

        tileShadow.width = sizeW-16;

        topShadow.addChild(tileShadow);
        topShadow.addChild(sideShadowL);
        topShadow.addChild(sideShadowR);

        backing.graphics.beginFill(bgColor);
        backing.graphics.lineStyle(borderSize, borderColor);
        backing.graphics.drawRect(position, position, sizeW-17, videoHDiff);
        backing.graphics.endFill();
        backing.y = tileShadow.height - 1;


        //DRAW THE TABS -------------
        for (i in tabData) 
        {
            //trace("TAB TITLES: "+tabData[i].id);

            var tab    :MovieClip = new TabDefault();
            var active :MovieClip = new TabActive();

            tabArray.push(tab);
            //tab.video = tabData[i].video;
            //tab.title = tabData[i].title;
            tab.addChild(active); // add active tab movieclip to default tab movieclip

            // tabNamer creates the active & default textfields
            tabNamer(tabNameActive,  Fonts.ActiveTabText,  tabData[0].id); // for ActiveTab
            tabNamer(tabNameDefault, Fonts.DefaultTabText, tabData[i].id); // for DefaultTabs

            i < 1 ? active.visible = true : active.visible = false;
            //i < 1 ? tab.addChild(tabNameActive) : tab.addChild(tabNameDefault);
            i < 1 ? tabArray[0].addChild(tabNameActive) : tabArray[i].addChildAt(tabNameDefault,2);

            //tabArray[i].addChildAt(tabNameDefault,2);
            //tab.addChild(tabNameDefault);
            //if (i < 1) { tab.addChild(tabNameActive) }

            trace("i = "+i);
            trace("tabArray["+i+"].getChildAt(2) = "+tabArray[i].getChildAt(2).text);
            trace("tabNameDefault.text = "+tabNameDefault.text);

            // resize the tab background to textfield
            tab.y      =         topShadow.y + 5;
            //     if first size to active textfield + 10    : if not size to default textfield + 10
            tab.width  = i < 1 ? tabNameActive.width + 10    : tabNameDefault.width + 10;
            tab.x      = i < 1 ? 10                          : tabArray[(i-1)].x + (tabArray[(i-1)].width + 3);
            //tab.active = i < 1 ? tab.active = true           : tab.active = false;

            topShadow.addChild(tab);

            tab.mouseChildren = false;
            tab.buttonMode    = true;
            tab.addEventListener(MouseEvent.CLICK, tabClick);
        }

        // set default thumbnails here
        //trace("tabData[0].id : "+tabData[0].id.@id+"\r");
        //trace("tabData[0].video: "+"\r"+tabData[0].video+"\r");
        //trace("tabData[0].titles : "+tabData[0].titles+"\r");
    }

    private function tabNamer(textfield, textFormat, tabText):void
    {
        //trace("TabNamer called");
        textfield.defaultTextFormat = textFormat;
        textfield.border            = false;
        textfield.embedFonts        = false;
        textfield.gridFitType       = "SUBPIXEL";
        textfield.sharpness         = 100;
        textfield.antiAliasType     = flash.text.AntiAliasType.ADVANCED;
        textfield.autoSize          = TextFieldAutoSize.CENTER;
        textfield.selectable        = false;
        textfield.mouseEnabled      = false;
        textfield.x                 = 10;
        textfield.y                 = 4;
        textfield.text              = tabText;
    }

    private function tabClick(e:MouseEvent = null):void
    {
        for (var i in tabArray) {
                //tabArray[i].active = false;
                tabArray[i].getChildAt(1).visible = false;
        }

        //e.target.active = true;
        e.target.getChildAt(1).visible = true;
        trace("Text for button clicked: "+e.target.getChildAt(2).text+"\r");

        //trace("THUMBNAILS FOR TAB: " + e.target.video);
        // pass the video data to the thumbnail class
    }

}

}



tabNamer関数

private function tabNamer(textfield, textFormat, tabText):void
{
    //trace("TabNamer called");
    textfield.defaultTextFormat = textFormat;
    textfield.border            = true;
    textfield.embedFonts        = false;
    textfield.gridFitType       = "SUBPIXEL";
    textfield.sharpness         = 100;
    textfield.antiAliasType     = flash.text.AntiAliasType.ADVANCED;
    textfield.autoSize          = TextFieldAutoSize.CENTER;
    textfield.selectable        = false;
    textfield.mouseEnabled      = false;
    textfield.x                 = 10;
    textfield.y                 = 4;
    textfield.text              = tabText;
}



tabClick関数

private function tabClick(e:MouseEvent = null):void
    {
        for (var i in tabArray) {
                //tabArray[i].active = false;
                tabArray[i].getChildAt(1).visible = false;
        }

        //e.target.active = true;
        e.target.getChildAt(1).visible = true;
        trace("Text for button clicked: "+e.target.getChildAt(2).text+"\r");

        //trace("THUMBNAILS FOR TAB: " + e.target.video);
        // pass the video data to the thumbnail class
    }



これらは、タブの作成関数(クラス関数)からのトレースです。

i = 0
tabArray[0].getChildAt(2) = This is first tab
tabNameDefault.text = This is first tab
i = 1
tabArray[1].getChildAt(2) = 2nd Tab
tabNameDefault.text = 2nd Tab
i = 2
tabArray[2].getChildAt(2) = The 3rd Tab
tabNameDefault.text = The 3rd Tab
i = 3
tabArray[3].getChildAt(2) = The 4th and last tab
tabNameDefault.text = The 4th and last tab



これらは、タブをクリックしたときに取得するトレースです(2番目と3番目のテキストフィールドを見つけようとしています)

//Clicked Tab 1
Text for button clicked: This is first tab

//Clicked Tab 2
RangeError: Error #2006: The supplied index is out of bounds.
at flash.display::DisplayObjectContainer/getChildAt()
at com.leongaban.ui::TabMenu/tabClick()

//Clicked Tab 3
RangeError: Error #2006: The supplied index is out of bounds.
at flash.display::DisplayObjectContainer/getChildAt()
at com.leongaban.ui::TabMenu/tabClick()

//Clicked Tab 4
Text for button clicked: The 4th and last tab



この一日中私の脳をかき集めてきました:(アドバイス、ヒント、または男を期待しているのはそのためです!:)

4

3 に答える 3

1

問題は、TextFieldを再利用していることです。tabNameActiveは、ループ全体で同じテキストフィールドを参照しています。

私の推測では、テキストフィールド'tabNameActive'がステージ上にあります。その場合は、次のことを行う必要があります。

1)ステージからtabNameActiveを削除します

2)ライブラリに移動し、tabNameActiveを見つけます。右クリックしてプロパティをクリックします。「最初のフレームでエクスポート」にチェックを入れます。

3)ウィンドウが表示されます。次に、クラス識別子「TabNameActiveClass」を指定します。

4)コードに戻ります。forループ内で、これを変数宣言の下に追加します。

var tab:MovieClip = new TabDefault();
var active:MovieClip = new TabActive();
var tabNameActive:TabNameActiveClass = new TabNameActiveClass();

これは機能するはずです。

要約:基本的に、テキストをクラスとして作成し、ループ内で別のインスタンスを作成します。現在、インスタンスを再利用しているだけで、作成中に基本的にタブ1からタブ4に移動します。

以下のコメントに応じて編集:

クラス定義から削除します。

private var tabNameDefault:TextField = new TextField();
private var tabNameActive :TextField = new TextField();

次に、ループを追加します。

var tab:MovieClip = new TabDefault();
var active:MovieClip = new TabActive();
var tabNameActive:TextField = new TextField();
var tabNameDefault:TextField = new TextField();
于 2010-02-06T03:06:51.600 に答える
1

あなたの問題はTextFieldの再利用にあるように私には思えますtabNameDefault。コードの動作は次のとおりです。

  1. tabNameActiveおよびのテキストをtabNameDefault最初のタブのデータに設定します
  2. tabNameActive最初のタブの子として追加
  3. tabNameActiveおよびのテキストをtabNameDefault2番目のタブのデータに設定します
  4. tabNameDefault2番目のタブの子として追加
  5. tabNameActiveおよびのテキストをtabNameDefault3番目のタブのデータに設定します
  6. tabNameDefault3番目のタブの子として追加します。これにより、2番目のタブから削除されます。
  7. tabNameActiveおよびのテキストをtabNameDefault4番目のタブのデータに設定します
  8. 4番目のタブの子として追加tabNameDefaultし、3番目のタブから削除します。
于 2010-02-05T21:37:32.273 に答える
0

すべてのコードを表示していません。具体的には、テキストフィールドを作成している場所はどこにもありません。私の推測では、2つのテキストフィールド(tabNameActiveとtabNameDefault)のみを作成します。タブを作成するforループ内のどこかに「newTextField()」のようなものがあるはずです。

コードのインデントを修正してください。あちこちで読むのは非常に困難です。また、特に式の代わりにステートメントを実行するためにa?b:c構文を使用している場合は、必要のない場所でa?b:c構文を使用しないことをお勧めします。

于 2010-02-05T21:37:55.830 に答える