Flex: изменить встроенный значок и использовать его в кнопке?
Просто, если вы вставляете иконку:
[Embed(source='icons/checkmark.png')]
private static var CheckMark:Class;
Вы в конечном итоге с динамическим классом. Вы можете довольно легко назначить значок кнопке во время выполнения, вызвав метод setStyle:
var btn:Button = new Button();
btn.setStyle("icon", CheckMark);
Но что, если вы хотите изменить значок во время выполнения, например, изменить его альфа-значение или даже перерисовать пиксели, прежде чем назначить его кнопке?
Пока я не могу найти удовлетворительный ответ...
3 ответа
Это единственный ответ, который мне показался близким: динамические значки (пример с View Source)
Его решение включает в себя пользовательский класс "Dynamic Icon", который используется в настройке значка кнопки, и пользовательский класс Button, который добавляет один метод в класс Button для рисования динамических значков.
В результате вы можете отправить BitmapData в класс Dynamic Icon, который будет отображаться на кнопке. Итак, вставьте ваше изображение, создайте экземпляр класса ресурсов, получите битмапассет и измените его так, как вам нужно, и отправьте bitmapData на иконку.
Это интересная проблема, и кажется, что должно быть более простое решение, но это работает без особых хлопот.
Чтобы решить эту проблему, нужно реализовать программный класс скина, который рисует сам значок вручную. Вероятно, вам придется проделать еще больше работы, чтобы убедиться, что кнопка рассчитывает правильный размер, как если бы у нее была иконка, хотя у нее ее нет. Возможно, вам придется просмотреть исходный код Button, чтобы посмотреть, как хранится ссылка на значок.
Мне нравится просто создавать программные скины, которые делают именно то, что я хочу, а затем использовать интересные объявления CSS для изменения состояний - например:
button.setStyle("customIconAlpha", .4);
и тогда, конечно, скин или пользовательский класс кнопок будут иметь:
var alpha:Number = getStyle("customIconAlpha") as Number;
(не уверен, что вам придется это делать)
Большая проблема, которую я нашел с программными оболочками, состоит в том, что кнопка отказывается измерять ширину / высоту. Я легко обошел это, переопределив методы get для каждого:
переопределить публичную функцию get width():Number { return WIDTH; } переопределить публичную функцию get height():Number { return HEIGHT; }
В моем случае мне нужно было изменить кнопки в TabNavigator, поэтому нет простого способа создать подкласс для кнопки. К счастью, родительским элементом каждого скина является кнопка, поэтому, используя статические методы в вашем скине, вы можете идентифицировать экземпляр Button, которому принадлежат скины значков.
Если вы используете стиль "значок" для всех обложек, для каждого состояния будет создан новый объект обложки. Так что вам нужно помнить об этом при изменении состояния значков.