Установка значения динамического текстового поля внутри объекта button

#flash #actionscript-3

#flash #actionscript-3

Вопрос:

У меня есть динамическое текстовое поле в моем объекте button. Я назвал текстовое поле «myText». Как я могу изменить текст внутри него? myButton.myText.text = "test"; не будет работать, потому что он не может получить доступ myText .

Комментарии:

1. Кроме того, я уже пару лет не занимался Flash-кодированием, поэтому приношу извинения за то, что, вероятно, очень быстро исправить.

Ответ №1:

Обычно я просто создаю видеоролик, содержащий пустую кнопку и динамическое текстовое поле. Если вы установите mouseEnabled = false значение в текстовом поле, это не будет мешать событиям мыши на кнопке.

Редактировать:
Вот пример пользовательского класса кнопок, который я иногда использую:

 package {

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.text.TextField

public class CustomButton extends MovieClip {

    public var t_label:TextField; 

    public function CustomButton() {
        t_label.mouseEnabled = false;
        mouseChildren = false;
        buttonMode = true;

        this.gotoAndStop("normal");
        addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
        addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
        addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
    }

    public function setLabel(buttonLabel:String):void {
        t_label.text = buttonLabel;
    }

    public function destroy():void {
        removeEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
        removeEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
        removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
    }

    protected function onMouseOver(e:MouseEvent):void {
        this.gotoAndStop("over");
    }

    protected function onMouseOut(e:MouseEvent):void {
        this.gotoAndStop("normal");
    }

    protected function onMouseDown(e:MouseEvent):void {
        this.gotoAndPlay("down");
    }

}   
 

}

Вы можете связать это с видеороликом, в котором есть кадры с надписями «нормальный», «над» и «вниз», и он будет функционировать как обычная кнопка с динамической меткой.

Если вам нужно настроить внешний вид текста для разных состояний, вы можете сделать это в обработчиках событий.

Комментарии:

1. Как текстовое поле узнает, что нужно изменить цвет, когда состояние кнопки изменится? Это белый текст на черной кнопке в верхнем штате и обратный на нижнем.

2. Этого не произойдет. Если вам нужно изменить внешний вид текста для состояний кнопки, вам придется использовать другой метод. Вы можете создать пользовательский класс, который обрабатывает события MOUSE_OVER, MOUSE_OUT и MOUSE_DOWN и соответствующим образом настраивает цвет текста.

3. Есть ли какой-либо способ обрабатывать изменение состояния кнопки вместо движений мыши?

4. Я обновил свой ответ, чтобы показать метод, который я обычно использую для этого. Но вы можете предпочесть сделать то, что предлагает shanethehat, и назначить состояния кнопки для разных графиков. Тогда вам не придется возиться с событиями мыши (предположительно, кроме щелчка).

Ответ №2:

Обновленный ответ:

У меня есть два решения для вас, но одно требует, чтобы у вас было только одно текстовое поле в кнопке и никаких других объектов.

1:

Если у вас есть только одно текстовое поле в вашей кнопке, тогда upState свойство вашей кнопки будет текстовым полем, и затем вы можете напрямую установить его свойство text:

 myButton.upState.text = "Click Me";
myButton.downState.text = "Click Me";
myButton.overState.text = "Click Me";
 

2:

Если первый метод к вам неприменим, решение немного сложнее.

Сначала создайте в своей библиотеке видеоролик, содержащий текущее содержимое верхней рамки вашей кнопки. Установите для него значение export и присвоите ему имя класса ( TextHolder ). Затем вы можете создать объект TextHolder, задать его свойство textLabel для text и назначить его для каждого состояния кнопки:

 var buttonState:TextHolder = new TextHolder();
buttonState.myText.text = "Click me";
myButton.upState = myButton.downState = myButton.overState = myButton.hitTestState = buttonState;
 

Если вы хотите создать разные состояния, скажем, с текстом разного цвета, вам придется создавать разные объекты для разных состояний:

 var buttonState:TextHolder = new TextHolder();
var buttonStateOver:TextHolder = new TextHolder();
buttonState.myText.text =  buttonStateOver.myText.text = "Hello";
buttonStateOver.x = 10;
myButton.upState = buttonState;
myButton.hitTestState = buttonState;
myButton.downState = myButton.overState = buttonStateOver;
 

Комментарии:

1. Это прискорбно. Спасибо!

2. Не помечено как правильное, потому что я, возможно, действительно нашел что-то, что работает, не делая всего этого. Я снова отмечу, если не смогу заставить его работать. myButton.upState кажется многообещающим…

3. Спасибо! У меня все еще возникают проблемы, но я двигаюсь в правильном направлении.

4. Будет ли работать ваш вариант 2, если у него есть другие (неименованные) объекты? Моя текущая кнопка выглядит так: i.imgur.com/gD7me.png

5. Вам нужно будет добавить эти другие элементы в компонент TextHolder. Я обновлю свой ответ для ясности.