2009-10-14 4 views
0

Любой, кто знает, как это сделать, действительно поможет мне.уведомление о визуальных изменениях?

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

Но в любом случае, здесь это:

У меня есть несколько встроенных SWF на холсте (в SWFLoaders), и когда один из них изменяет визуально мне нужно знать, какой из них изменилось.

«визуализации» событие обеспечивает только часть решения:

Если SWFLoader содержит VideoDisplay имеются постоянные визуализации событий, генерируемых в исходном приложении в то время как VideoDisplay работает. Если SWFLoader просто содержит некоторый статический входной контроль otoh, в родительском приложении нет сообщений рендеринга, пока кто-то не взаимодействует с этим элементом управления и не изменяет его визуально, а затем в родительском приложении отображаются события трансляции. Таким образом, это явно часть моих требований.

Проблема рендеринга события однако, является то, что он делает не сказать вам который встроенный SWF на самом деле изменилось (в мишени или currentTarget.)

Но мне нужно знать, какой из них изменилось.

(Есть индивидуальные визуализации сообщений генерируются в пределах встроенного приложение (отдельно от тех, в родительском приложении), например, которые могут быть обнаружены.)

+0

- это изменение состояния рендеринга, единственное, что сможет сказать вам, что является активным? или изменение рендера всегда активируется взаимодействием пользователя? – longstaff

+0

Событие рендеринга - единственное, что я знаю об этом, даже приблизительно приближающемся к тому, что мне нужно. Но, как я сказал, он не говорит, какой встроенный элемент изменился, что мне нужно, он только обнаруживает, что он изменился. Но его не увольняют пользовательское взаимодействие как таковое, а визуальное изменение элемента управления. Я думаю, что на самом деле это вызвано элементами управления, вызывающими stage.invalidate(). Но в любом случае я придумал решение, которое будет работать для меня, поэтому я просто опубликую его как ответ ниже и закрою это, потому что никто даже не знает, о чем я говорю, очевидно. – Mark

ответ

1

Моим решения заключается в следующем:

Когда происходит событие рендеринга, я проверяю, есть ли видимый swfloader в окне браузера, а затем я делаю BitmapData.draw его содержимое в битмапдат, который сохраняется. С каждым новым событием визуализации я сравниваю 10% пикселей сохраненного растрового изображения с новым растровым изображением, и это скажет мне, действительно ли измененный визуальный контент .swf изменился. 10% Образец А, оказалось более чем достаточно (только переборе векторы соответствующих битовых карт с векторным индексом увеличивается на 10, вместо 1.)


BitmapData.draw много быстро и перебор 10000 векторных элементов - как миллисекунда.

+0

Это, наверное, лучший ответ. –

+0

Ну, его интерес, вы бы сказали, что это было «лучшее». Я думал, что это было «достаточно хорошо» и в высказывании «Лучшее - это враг достаточно хорош». У меня было видение туннеля на пару дней, к сожалению, о том, как я хотел это сделать, так что не смог увидеть другие решения. – Mark

+0

Может быть, быстрее нарисовать второй битмапдат над первым с разностным режимом смешивания, а затем сделать getColorBounds, чтобы увидеть, не были ли какие-либо пиксели не черными. – sharvey