PDA

Просмотр полной версии : Метод beginGradientFill(). Баг или что то еще...


Alex_beginner
24.06.2008, 19:44
Здравствуйте уважаемые Форумчане!

У меня есть простой вопрос ответ на который никак не укладывается у меня в голове (наверно я тупой). Однако, мне очень желательно разобраться в этом вопросе. Вот, собственно, сам вопрос:

"Известный метод класса MovieClip - beginGradientFill() принимает ряд параметров, два из которых это fillType и interpolationMethod. Так вот передав в метод в качестве fillType строковое значение linear, а в качестве значения interpolationMethod - linearRGB и задав в качестве параметра matrix - матрицу индентичности (по главной диагонали 1) вдруг выясняется, что середина "гигантского градиента" (от -819.2 до 819.2) т.е. в нулевой позиции значение цвета градиента вовсе не 128 (для одноцветного градиента - например, красного)". Если же я выставляю значение interpolationMethod в RGB - градиент становиться вдруг линейным.

Что это баг или закономерное поведение метода?!!!

iNils
25.06.2008, 00:03
Хочу код!:)

Alex_beginner
25.06.2008, 10:43
Здравствуй iNils!
Выкладываю тестовый код.

Обрати внимание на следующее:

1. Клик на крайнем левом пикселе дает значение цвета 0x000000;
2. Клик на крайнем правом пикселе дает значение цвета 0xFF0000;
3. Клик на центральном пикселе дает значение цвета 0xBB0000 (R=0xBB=187), что не соответствует среднему значению цвета между 0 и 255 - 128. Это, собственно, и непонятно, поскольку в параметре interpolationMethod выставлено значение linearRGB.

Заранее благодарен!

iNils
25.06.2008, 17:09
Линейный градиент в цифрах как раз дает RGB, а linearRGB - визуально. Что хорошо видно в скринах хелпа.
import flash.geom.Matrix;
import flash.display.BitmapData;
var myClip:MovieClip = this.createEmptyMovieClip ("myClip", this.getNextHighestDepth ());
var w:Number = 2000;
var myMatrix:Matrix = new Matrix ();
myMatrix.createGradientBox (w, 900, 0, 0, 0);
myClip.beginGradientFill ("linear", [0x000000, 0x0000FF], [100, 100], [0x00, 0xFF], myMatrix, "repeat", "RGB");
myClip.moveTo (0, 0);
myClip.lineTo (w, 0);
myClip.lineTo (2000, 900);
myClip.lineTo (0, 900);
myClip.lineTo (0, 0);
myClip.endFill ();
var myBMP:BitmapData = new BitmapData (myClip._width, myClip._height, false);
myBMP.draw (myClip, new Matrix (), null, "normal", null, false);
trace (myBMP.getPixel (w / 4, 0));
trace (myBMP.getPixel (w / 2, 0));
trace (myBMP.getPixel (w * 3 / 4, 0));

Alex_beginner
25.06.2008, 17:51
iNils! Действительно в скринах хелпа видно, что RGB линейный, а linearRGB нелинейный. Но фактически linear означает линейный, а в данном случае он не линейный, а скорее квадратичный.:)
И потом зачем нужно было разработчикам Флеша разделять так называемую линейность градиента на визуальную и та что "в цифрах". Не лучше ли было сделать две константы определяющую вид градиента - первая linearRGB - линейный как "в цифрах" так и визуально, вторая - quadraticRGB, который как в цифрах, так и визульно выглядит как квадратичный.

iNils
25.06.2008, 17:56
Разработчика флеша тут не причем. Это уже исторически сложилось.

Alex_beginner
25.06.2008, 18:09
Ууупс! iNils! Подскажи где про эту историю почитать (желательно на русском) - благодарен буду.