簡単な方法は、いくつかの塗りつぶしレイヤー(1つは背景用、もう1つは「進行中」の塗りつぶし用)を定義してから、シェイプを定義するムービークリップを追加するマスクレイヤーを定義することです。これは、背景と進行状況の塗りつぶしに任意のタイプの塗りつぶしを、シェイプマスクに任意のDisplayObjectを使用できる実装です。長方形を拡大縮小するのではなく、進行状況の塗りつぶしを再描画して、ビットマップとグラデーションの塗りつぶしが歪まないようにします。
単純な単色の塗りつぶし(白い背景に黒いバー)を使用して作成する方法は次のとおりです。
var pBar:MorphProgressBar = new MorphProgressBar(
new GraphicsSolidFill(0xFFFFFF), new GraphicsSolidFill(0), myMc);
addChild(pBar);
pBar.progress = 0.3; // 30 %
のコードは次のとおりですMorphProgressBar
。このバージョンはテストされ、動作します。
import flash.display.IGraphicsFill;
import flash.display.Sprite;
import flash.geom.Rectangle;
import flash.display.Shape;
import flash.display.IGraphicsData;
import flash.display.DisplayObject;
public class MorphProgressBar extends Sprite {
private var _progressFill:IGraphicsFill;
private var _bounds:Rectangle;
private var _progress:Number;
private var _fillSprite:Sprite = new Sprite();
private var _bg:Shape = new Shape();
private var _bar:Shape = new Shape();
private var _maskSprite:Sprite = new Sprite();
public function MorphProgressBar(
baseFill:IGraphicsFill,
progressFill:IGraphicsFill,
shapeSource:DisplayObject) {
_progressFill = progressFill;
_bounds = new Rectangle(0,0,shapeSource.width,shapeSource.height);
_bg.graphics.drawGraphicsData(Vector.<IGraphicsData>([baseFill]));
_bg.graphics.drawRect(0,0,_bounds.width, _bounds.height);
_fillSprite.addChild(_bg);
_fillSprite.addChild(_bar);
_maskSprite.addChild(shapeSource);
addChild(_fillSprite);
addChild(_maskSprite);
_fillSprite.mask = _maskSprite;
}
public function get progress():Number { return _progress; }
public function set progress(value:Number):void {
var newProgress:Number = Math.min(Math.max(value,0),1);
if (newProgress != _progress) {
_progress = newProgress;
updateProgress();
}
}
private function updateProgress():void {
_bar.graphics.clear();
_bar.graphics.drawGraphicsData(Vector.<IGraphicsData>([_progressFill]));
_bar.graphics.drawRect(0,0,_bounds.width * progress, _bounds.height);
}
}