Как получить цвет свечения текста в AS3?

#actionscript-3

#actionscript-3

Вопрос:

У меня есть несколько текстовых полей со свечением, добавленных через AS3, как показано в приведенном ниже коде.

     var glow:GlowFilter = new GlowFilter();
    glow.color = 0x00FFFF;
    glow.alpha = 1;
    glow.blurX = 5;
    glow.blurY = 5;
    glow.quality = BitmapFilterQuality.HIGH;

    textfield1.filters = [glow];
  

Я хотел бы знать, существует ли функция для получения цвета свечения!

Что-то вроде этого:

 textfield2.getGlowFilter.color;
  

Ответ №1:

Для этого нет функции. Но вы могли бы перебрать массив фильтров, найти фильтр и получить его цвет, как только вы его найдете.

Что-то вроде этого (непроверенное):

 for(var i:int = 0; i < textfield1.filters.length;i  ) {
    if(textfield1.filters[i] is GlowFilter) {
        textfield1.filters[i].color;
    }
}
  

Ответ №2:

Ответ на этот вопрос уже был принят, но до того, как это было сделано, я работал над классом, который упростил бы получение определенного BitmapFilter текста, ну что ж, я все равно опубликую свой ответ.

Filters.as:

 package filters 
{
    import flash.display.DisplayObject;
    import flash.filters.BevelFilter
    import flash.filters.BitmapFilter;
    import flash.filters.BlurFilter
    import flash.filters.ColorMatrixFilter
    import flash.filters.ConvolutionFilter
    import flash.filters.DisplacementMapFilter
    import flash.filters.DropShadowFilter
    import flash.filters.GlowFilter
    import flash.filters.GradientBevelFilter
    import flash.filters.GradientGlowFilter

    public class Filters 
    {
        public static var throwsError:Boolean;

        public static function getBevelFilter(displayObject:DisplayObject):BevelFilter
        {
            return BevelFilter(getBitmapFilter(displayObject, BevelFilter));

        }// end function

        public static function getBlurFilter(displayObject:DisplayObject):BlurFilter
        {
            return BlurFilter(getBitmapFilter(displayObject, BlurFilter));

        }// end function

        public static function getColorMatrixFilter(displayObject:DisplayObject):ColorMatrixFilter
        {
            return ColorMatrixFilter(getBitmapFilter(displayObject, ColorMatrixFilter));

        }// end function

        public static function getConvolutionFilter(displayObject:DisplayObject):ConvolutionFilter
        {
            return ConvolutionFilter(getBitmapFilter(displayObject, ConvolutionFilter));

        }// end function

        public static function getDisplacementMapFilter(displayObject:DisplayObject):DisplacementMapFilter
        {
            return DisplacementMapFilter(getBitmapFilter(displayObject, DisplacementMapFilter));

        }// end function

        public static function getDropShadowFilter(displayObject:DisplayObject):DropShadowFilter
        {
            return DropShadowFilter(getBitmapFilter(displayObject, DropShadowFilter));

        }// end function

        public static function getGlowFilter(displayObject:DisplayObject):GlowFilter
        {
            return GlowFilter(getBitmapFilter(displayObject, GlowFilter));

        }// end function

        public static function getGradientBevelFilter(displayObject:DisplayObject):GradientBevelFilter
        {
            return GradientBevelFilter(getBitmapFilter(displayObject, GradientBevelFilter));

        }// end function

        public static function getGradientGlowFilter(displayObject:DisplayObject):GradientGlowFilter
        {
            return GradientGlowFilter(getBitmapFilter(displayObject, GradientGlowFilter));

        }// end function

        public static function updateFilters(displayObject:DisplayObject, ...bitmapFilters:Array):void
        {
            for (var i:uint = 0; i < bitmapFilters.length; i  )
            {
                if (!(bitmapFilters[i] is BitmapFilter))
                {
                    throw new ArgumentError("bitmapFilters argument must be of type BitmapFilter");

                }// end if

            }// end for             
            var filterArray:Array = new Array();

            for each(var bitmapFilter:BitmapFilter in displayObject.filters)
            {
                filterArray.push(bitmapFilter);

            }// end for             

            for (var j:uint = 0; j < filterArray.length; j  )
            {
                for (var k:uint = 0; k < bitmapFilters.length; k  )
                {
                    if (filterArray[j] is Class(Object(bitmapFilters[k]).constructor))
                    {
                        filterArray[j] = bitmapFilters[k];

                    }
                    else
                    {
                        if (throwsError) throw new Error("One or more bitmapFilters arguments did not exist in the display object's filters array");

                    }// end else

                }// end for

            }// end for

            displayObject.filters = filterArray;


        private static function getBitmapFilter(displayObject:DisplayObject, BitmapFilterClass:Class):BitmapFilter
        {
            var bitmapFilter:BitmapFilter;

            for each(var bf:BitmapFilter in displayObject.filters)
            {
                if (bf is BitmapFilterClass)
                {
                    bitmapFilter = bf;
                    break;

                }// end if

            }// end for

            if (!bitmapFilter amp;amp; throwsError)
            throw new Error("Could not find BitmapFilter");

            return bitmapFilter;

        }// end function

    }// end class

}// end package
  

Main.as:

 package 
{
    import filters.Filters;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.filters.GlowFilter;

    public class Main extends Sprite 
    {

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

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var sprite:Sprite = new Sprite();
            sprite.graphics.beginFill(0xFF0000);
            sprite.graphics.drawCircle(0, 0, 100);
            sprite.graphics.endFill();
            sprite.filters = [new GlowFilter()];
            sprite.x = stage.stageWidth / 2;
            sprite.y = stage.stageHeight / 2;
            addChild(sprite);

            var spriteGlowFilter:GlowFilter = Filters.getGlowFilter(sprite);
            spriteGlowFilter.blurX = 10;
            spriteGlowFilter.blurY = 10;

            sprite.filters = [spriteGlowFilter];

        }// end function


    }// end class

}//end package
  

[ОБНОВИТЬ]

Это обновление является ответом на первый комментарий Хуана Пабло Калифано. Проблема с «Изменением последней строки на return new BitmapFilterClass(); » заключается в том, что это вернет новый экземпляр BitmapFilter , в то время как мы хотим вернуть ссылку на BitmapFilter экземпляр, который уже находится в массиве filters свойств отображаемого объекта.

Например, мы создаем Sprite объект и добавляем новый экземпляр GlowFilter в его filters свойство, задав аргументу color значение 0xFFFF00 (желтый):

 var sprite:Sprite = new Sprite();
sprite.graphics.beginFill(0xFF0000);
sprite.graphics.drawCircle(0, 0, 100);
sprite.graphics.endFill();
sprite.filters = [new GlowFilter(0xFFFF00)];
sprite.x = stage.stageWidth / 2;
sprite.y = stage.stageHeight / 2;
addChild(sprite);
  

Now when we trace the color property of the returned GlowFilter object using the public static getGlowFilter method we get the following:

 trace(Filters.getGlowFilter(sprite).color); // output: 16776960(0xFFFF00, yellow);
  

Однако, если бы мы изменили код, как предложено, мы получили бы следующее:

 trace(Filters.getGlowFilter(sprite).color); // output: 16711680(0xFF0000, red);
  

Теперь более простой способ избежать получения ошибки при обращении к нулевому значению — использовать оператор contional:

 if (Filters.getGlowFilter(sprite) != null)
{
    var spriteGlowFilter:GlowFilter = Filters.getGlowFilter(sprite);
    spriteGlowFilter.blurX = 10;
    spriteGlowFilter.blurY = 10;
    sprite.filters = [spriteGlowFilter];

}// end if
  

[ОБНОВЛЕНИЕ 2]

Я обновил Filters класс, чтобы включить простую функцию обработки ошибок, которая выдает ошибку, если BitmapFilter не удается найти при использовании общедоступного статического метода, подобного getBevelFilter() . Эту функцию можно включать и выключать, задав соответствующее логическое значение true или false общедоступному статическому свойству throwsError .

 var sprite:Sprite = new Sprite();
sprite.graphics.beginFill(0xFF0000);
sprite.graphics.drawCircle(0, 0, 100);
sprite.graphics.endFill();
sprite.filters = [new GlowFilter(0xFFFF00)];
sprite.x = stage.stageWidth / 2;
sprite.y = stage.stageHeight / 2;
addChild(sprite);

Filters.throwsError = true;
Filters.getDropShadowFilter(sprite); // error: Could not find BitmapFilter
  

[ОБНОВЛЕНИЕ 3]

В ответ на второй комментарий Хуана Пабло Калифано я добавил общедоступный статический метод updateFilters() , который не требует пояснений, поэтому я просто покажу пример его использования:

 var sprite:Sprite = new Sprite();
sprite.graphics.beginFill(0xFF0000);
sprite.graphics.drawCircle(0, 0, 100);
sprite.graphics.endFill();
sprite.filters = [new GlowFilter()];
sprite.x = stage.stageWidth / 2;
sprite.y = stage.stageHeight / 2;
addChild(sprite);

Filters.throwsError = true;

var glowFilter:GlowFilter = Filters.getGlowFilter(sprite);
glowFilter.blurX = glowFilter.blurY  = 10;

Filters.updateFilters(sprite, glowFilter);
  

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

1. @Taurayi. Возможно, вы могли бы вернуть новый экземпляр запрошенного фильтра в свой getBitmapFilter , если ни один не был найден. Изменение последней строки на return new BitmapFilterClass(); должно сделать это. Таким образом, вам не нужно было бы проверять, является ли возвращаемое значение Filters.getGlowFilter(sprite) null (в этом случае вы получили бы Error ).

2. @Taurayi. Кроме того, я думаю, очень полезным улучшением вашего класса был бы addToFiltersArray(filter) метод (или что-то еще в этих строках). Идея в том, что к вашему объекту может быть применено более одного фильтра. Если вы просто сделаете это sprite.filters = [theFilter]; , вы отключите другие фильтры. Правильный способ — это объединить фильтр с новым массивом и назначить его, что является довольно шаблонным. Итак, этот метод мог бы сделать это за вас и вернуть массив, который вы можете безопасно присвоить свойству filters..

3. @Juan Pablo Califano спасибо за комментарии, хотя я согласен с вашим вторым комментарием, я вынужден не согласиться с вашим первым. Я объяснил, почему я не согласился с вашим первым комментарием в обновлении моего ответа. Что касается вашего второго комментария, я знаю, что он sprite.filters = [spriteGlowFilter]; присваивает filters свойству новый массив, таким образом эффективно заменяя предыдущий массив и все его BitmapFilter элементы, но поскольку это был один BitmapFilter элемент в массиве, замена его ленивым способом не показалась большой проблемой. Однако ничто в программировании не должно быть ленивым, поэтому я обновлю…

4. Filters создайте класс и добавьте общедоступный статический метод, который обновляет BitmapFilter элемент в массиве filters свойства, а не просто заменяет весь массив.

5. @Taurayi. Что касается моего первого комментария, я думал, что ваш код вернул фильтр сразу после его нахождения, но на самом деле у вас перерыв после установки bitmapFilter переменной (виноват, я обычно так пишу подобные вещи — ранние возвраты — и я не рассмотрел поближе). В любом случае, я имел в виду возврат фильтра, если он найден, или возврат нового экземпляра в противном случае. Таким образом, «клиентский» код мог бы быть более кратким, и вы могли бы вообще избежать проверки null (по крайней мере, в этом варианте использования возврат нового экземпляра, если ничего не найдено, имеет смысл для меня).