Je viens de développer un composant Flex Box, qui agit comme un conteneur de composant régulier, mais dessine un fond de rectangle arrondi, avec un autre rectangle arrondi indiquant un niveau de remplissage. Pour cela j'ai eu besoin de couper la partie supérieure qui ne devrait pas être remplie. Dessiner le rectangle de remplissage à la hauteur de remplissage n'était pas une option puisque les coins arrondis ne correspondraient pas.
Ce que j'appris:
- J'ai créé un composant toile juste pour tirer le niveau de remplissage avec des limites et 0/0 largeur/hauteur de la boîte
- J'ai ajouté que la toile à la boîte à l'index 0 via addChildAt()
- Je mis la propriété includeInLayout sur false pour cette toile car il ne devrait pas prendre part à la layouting de la boîte elle-même, mais plutôt agir comme une fenêtre de dessin flottant au-dessus
- je puis ajouté une autre toile comme le masque à ce fill-canvas (addChild(), et mettre m demander à la propriété)
Voici un code:
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
// super
super.updateDisplayList(unscaledWidth, unscaledHeight);
// prep
var g:Graphics = this.graphics;
var fgColor:int = this.getStyle("fillColor");
var bgColor:int = this.getStyle("backgroundFillColor");
var radius:int = this.getStyle("cornerRadius");
// clear
g.clear();
// draw background
g.beginFill(bgColor, 1);
g.drawRoundRect(0, 0, unscaledWidth, unscaledHeight, radius, radius);
g.endFill();
// draw fill level
if (this._fillLevel > 0) {
var fillHeight:int = int(unscaledHeight * this._fillLevel);
// extra component for drawing fill-level, so we can apply mask just to this
if (this._fillLevelCanvas == null) {
this._fillLevelCanvas = new Canvas();
this._fillLevelCanvas.x = 0;
this._fillLevelCanvas.y = 0;
this._fillLevelCanvas.includeInLayout = false;
this.addChildAt(this._fillLevelCanvas, 0);
}
this._fillLevelCanvas.width = unscaledWidth;
this._fillLevelCanvas.height = unscaledHeight;
// mask
if (this._fillLevelMask == null) {
this._fillLevelMask = new Canvas();
this._fillLevelMask.x = 0;
this._fillLevelMask.y = 0;
this._fillLevelCanvas.addChild(this._fillLevelMask);
this._fillLevelCanvas.mask = this._fillLevelMask;
}
this._fillLevelMask.width = this.width;
this._fillLevelMask.height = this.height;
this._fillLevelMask.graphics.beginFill(0xFFFFFF);
this._fillLevelMask.graphics.drawRect(0, this.height-fillHeight, this._fillLevelMask.width, this._fillLevelMask.height);
this._fillLevelMask.graphics.endFill();
this._fillLevelCanvas.graphics.beginFill(fgColor, 1);
this._fillLevelCanvas.graphics.drawRoundRect(0, 0, unscaledWidth, unscaledHeight, radius, radius);
this._fillLevelCanvas.graphics.endFill();
}
}
que les liens ne fonctionne pas pour moi, peut-être vous dire ce fil: http://forums.adobe.com/message/47864 # 47864 – Tom