На самом деле все оказалось просто.Чтобы обновить пластиковую полосу, я рисую содержимое окна в растровое изображение, а затем подаю его в шейдер, чтобы нарисовать полосу (здесь она называется blurred
):
private function onBlurredUpdate():void {
matrix.identity();
matrix.translate(-blurred.x, -blurred.y);
clipRect.width = blurred.width;
clipRect.height = blurred.height;
body.removeChild(blurred);
bitmapData.draw(body, matrix, null, null, clipRect);
body.addChild(blurred);
shader.data.src.input = bitmapData;
var graphics:Graphics = blurred.graphics;
graphics.clear();
graphics.lineStyle(2, 0xC0C0C0);
graphics.beginShaderFill(shader);
graphics.drawRoundRect(0, 0, blurred.width, blurred.height, 10, 10);
graphics.endFill();
}
Шейдер - это простой блочный фильтр из образцов PixelBender.Если я пропущу удаление полосы из окна перед рисованием, это даст забавный эффект обратной связи - размытые пиксели продолжат размываться, как чернила.