
Код AS3:
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.events.Event;
import flash.geom.Matrix;
import flash.display.StageScaleMode;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.frameRate = 60;
var background:Shape = new Shape();
background.graphics.beginFill(0xa0a0a0);
background.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
addChild(background);
var tf:TextField = new TextField();
tf.width = stage.stageWidth;
tf.height = 30;
tf.y = 10;
tf.defaultTextFormat = new TextFormat('Arial', 20, 0xffffff, true, null, null, null, null, TextFormatAlign.CENTER);
tf.text = '0%';
addChild(tf);
var rectToFill:BitmapData = new BitmapData(300, 200, false, 0xffffff);
var rectToFillBmp:Bitmap = new Bitmap(rectToFill);
rectToFillBmp.x = (stage.stageWidth - rectToFillBmp.width) / 2;
rectToFillBmp.y = (stage.stageHeight - rectToFillBmp.height) / 2;
addChild(rectToFillBmp);
var canvas:Shape = new Shape();
addChild(canvas);
var mtx:Matrix = new Matrix();
mtx.translate(-rectToFillBmp.x, -rectToFillBmp.y);
var brushPosition:Point = new Point();
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
function onMouseDown(event:MouseEvent):void {
//brushPosition.x = event.stageX;
//brushPosition.y = event.stageY;
canvas.graphics.moveTo(event.stageX, event.stageY);
canvas.graphics.lineStyle(40, 0xff0000);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpOrLeave);
stage.addEventListener(Event.MOUSE_LEAVE, onMouseUpOrLeave);
}
function onMouseMove(event:MouseEvent):void {
canvas.graphics.lineTo(event.stageX, event.stageY);
}
function onMouseUpOrLeave(event:MouseEvent):void {
stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUpOrLeave);
stage.removeEventListener(Event.MOUSE_LEAVE, onMouseUpOrLeave);
// Срисовываем нашу мазанину с холста в "прямоугольник".
rectToFill.draw(canvas, mtx, null, null, null, true);
canvas.graphics.clear();
// Берем самое яркое (255-е) значение "синего" (который по индексу 2)
// вектора гистограммы нашего "прямоугольника". Так как мы рисуем красным,
// под закрашенными пикселями тухнут зеленые и синие значения.
// Вот мы и ждем, когда распространение синих точек сведется со значения
// 60000 (ширина умноженная на высоту прямоугольника, его площадь в квадратных
// пикселях, так сказать) до нуля.
var ratio:Number = (1 - rectToFill.histogram()[2][255] / 60000) * 100;
if (ratio == 100) {
tf.text = int(ratio) + '% (готово!)';
} else if (ratio >= 90) {
tf.text = int(ratio) + '% (почти)';
} else if (ratio >= 70) {
tf.text = int(ratio) + '% (еще немножечко)';
} else {
tf.text = int(ratio) + '%';
}
}