#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 (по крайней мере, в этом варианте использования возврат нового экземпляра, если ничего не найдено, имеет смысл для меня).