Я бы сделал:
//the rectangle you would like to draw
var rectangle:Rectangle = new Rectangle(100,100,400,500);
var shape:Shape = new Shape();
var matrix:Matrix = new Matrix(1,0,0,1,-rectangle.x, -rectangle.y);
shape.graphics.beginBitmapFill(bitmapData, matrix);
shape.graphics.drawRect(0, 0, rectangle.width, rectangle.height);
shape.graphics.endFill();
Затем можно прокрутить, изменив положение прямоугольника или непосредственно изменив матрицу.
ОБНОВЛЕНИЕ: После проверки ответа МикаЯ был удивлен, обнаружив (после довольно быстрых и свободных тестов), что beginBitmapFill на самом деле быстрее, чем copyPixels.Я оставлю свои тестовые коды, поэтому, если вам интересно, попробуйте:
copyPixels (я получаю 15-20 кадров в секунду):
var bmp:BitmapData=new BitmapData(1000, 1000, true, 0);
bmp.perlinNoise(100, 100, 3, 1, true, true);
var arr:Array=new Array();
for (var i:uint = 0; i < 50; i++) {
var clip:Bitmap = new Bitmap(new BitmapData(500, 500));
addChild(clip);
clip.alpha = .05;
arr.push(clip);
}
var t1:uint = getTimer();
stage.addEventListener("enterFrame", function() {
trace(getTimer() - t1);
t1 = getTimer();
for each(var clip:* in arr) {
var x:uint=Math.random()*100;
var y:uint=Math.random()*100;
clip.bitmapData.copyPixels(bmp,new Rectangle(x,y,500,500), new Point);
}
});
и beginBitmapFill (я получаю 55-60 кадров в секунду):
var bmp:BitmapData=new BitmapData(1000, 1000, true, 0);
bmp.perlinNoise(100, 100, 3, 1, true, true);
var arr:Array=new Array();
for (var i:uint = 0; i < 50; i++) {
var clip:Shape = new Shape();
addChild(clip);
clip.alpha = .05;
arr.push(clip);
}
var t1:uint = getTimer();
stage.addEventListener("enterFrame", function() {
trace(getTimer() - t1);
t1 = getTimer();
for each(var clip:* in arr) {
var x:uint=Math.random()*100;
var y:uint=Math.random()*100;
clip.graphics.clear();
clip.graphics.beginBitmapFill(bmp,new Matrix(1,0,0,1,-x,-y),false,false);
clip.graphics.drawRect(0,0,500,500);
clip.graphics.endFill();
}
});