PDA

Просмотр полной версии : ColorMatrixFilter срабатывает на всегда


_squirrel
14.12.2007, 15:22
На aspx-странице нeсколько флешек типа (многоточие - пропущенный код, не суть важен):

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="220" height="165" id="hclick_1">
<param name="FlashVars" value="imagepath=http://...4.jpg&amp;noChange=1&amp;..."></param>
<param name="allowScriptAccess" value="sameDomain"></param>
<param name="movie" value="/swf/clickSt.swf"></param>
<param name="quality" value="high"></param>
<param name="bgcolor" value="#ffffff"></param>
<param name="wmode" value="transparent"></param>
<embed src="/swf/clickSt.swf" quality="high" bgcolor="#ffffff" width="220" height="165" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" wmode="transparent" name="hclick_1" FlashVars="imagepath=http://.../4.jpg&amp;noChange=1&amp;..."></embed>
</object>


Отличие между флешками только в id/name и FlashVars.

В самом swf идет загрузка картинки в мувик и установка ч/б фильтра, если параметр noChange=1. Примерно так:

if (!imgLoader) {var imgLoader:MovieClipLoader = new MovieClipLoader();}
var listener:Object = new Object();
listener.onLoadInit = function(target_mc:MovieClip):Void {
SetMonoColor(target_mc);
}
imgLoader.addListener(listener);
imgLoader.loadClip(picPath, cImgIn); // picPath == _root.imagepath, cImgIn:MovieClip

function SetMonoColor (mc:MovieClip) {
// readOnlyFlag == noChange
if (readOnlyFlag) {
var matrix:Array = new Array();

matrix = matrix.concat([0.25, 0.25, 0.25, 0.25, 0]);
matrix = matrix.concat([0.25, 0.25, 0.25, 0.25, 0]);
matrix = matrix.concat([0.25, 0.25, 0.25, 0.25, 0]);
matrix = matrix.concat([0, 0, 0, 1, 0]);

var filter:BitmapFilter = new ColorMatrixFilter(matrix);
mc.filters = new Array(filter);
}
}


Результат: поведение флеша весьма странное - иногда ч/б фильтр срабатывает, иногда нет (т.е. загруженные картинки остаются цветными). При том на одной странице из трех флешек одна например будет ч/б, а остальные цветными. Выглядит как чисто случайный процесс...
У меня не локалхосте все работает как надо, бага замечена заказчиком.
Передача/получение FlashVars проверено - все ок.
Пытались добавить параметр к url, чтоб избежать кеширования, типа: /swf/clickSt.swf?a=<какой-нибудь GUID> - не помогло.

Помогите пожалуйста! В чем может быть проблема??
У меня больше нет никаких идей...(((

З.Ы. Извините, если пост отправлен не туда

wvxvw
14.12.2007, 15:42
Не смотря на путаницу в областях видимости, код должен работать. Проблема скорее всего с передачей параметров (флешварз) попробуйте еще раз проверить.
(В смысле, переменные из флешварз не появляются в руте мгновенно до выполнения кода, попробуйте проверять их наличие watch'ем или в onEnterFrame.)

_squirrel
14.12.2007, 16:17
Нет, переменные точно здесь не при чем. Если убрать проверку на readOnly (см. код ниже), ситуация остается прежней :(

function SetMonoColor (mc:MovieClip) {
var matrix:Array = new Array();

matrix = matrix.concat([0.25, 0.25, 0.25, 0.25, 0]);
matrix = matrix.concat([0.25, 0.25, 0.25, 0.25, 0]);
matrix = matrix.concat([0.25, 0.25, 0.25, 0.25, 0]);
matrix = matrix.concat([0, 0, 0, 1, 0]);

var filter:BitmapFilter = new ColorMatrixFilter(matrix);
mc.filters = new Array(filter);
}


В чем же проблема??

wvxvw
14.12.2007, 16:20
import flash.filters.ColorMatrixFilter;
//
function SetMonoColor(mc:MovieClip) {
var matrix:Array = new Array();
matrix = matrix.concat([0.25, 0.25, 0.25, 0.25, 0]);
matrix = matrix.concat([0.25, 0.25, 0.25, 0.25, 0]);
matrix = matrix.concat([0.25, 0.25, 0.25, 0.25, 0]);
matrix = matrix.concat([0, 0, 0, 1, 0]);
var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);
mc.filters = new Array(filter);
getURL("javascript:alert('"+mc.filters.length+" : "+(mc.filters[0] instanceof ColorMatrixFilter)+"')");
}
Ну, попробуйте так, посмотрите, что скажет... хотя я на 99% уверен, что ошибка не связана с фильтром.

_squirrel
14.12.2007, 16:42
Тест проведен на моей машине, результат весьма занятный:
- если обращаться к странице через http://localhost/..., то все ок, алерт возвращает 1:true
- если обращаться к странице через http://<machine_name>/..., то все плохо и алерт возвращает undefined:false

Это что, что-то секьюрное?? о_О

wvxvw
14.12.2007, 23:57
Версия плеера какая? Битмапфильтры только с 8-й поддерживаются... хотя, это не объясняет различного поведения в пределах одной страницы =/ вобщем, странное что-то.
ЗЫ. Вот, подумал. Грузится флешка или картинка? Если флешка - может в ней стОит System.security.allowDomain("*"); поставить =/