Acabo de desarrollar un componente de Flex Box, que actúa como un contenedor de componentes regulares, pero dibuja un fondo rectangular redondeado, con otro rectángulo redondeado que indica un nivel de relleno. Para eso, necesitaba recortar la sección superior que no debería llenarse. Dibujar el rectángulo de relleno en la altura de relleno no era una opción, ya que las esquinas redondeadas no coincidían.
Lo que aprendí:
- he creado un componente simplemente lienzo para dibujar el nivel de llenado con límites 0/0 y anchura/altura de la caja
- añadí que la lona de la caja en el índice 0 a través de addChildAt()
- que establece la propiedad includeInLayout en false para que el lienzo, ya que no debe participar en el layout de la propia caja, sino más bien actuar como una panel de dibujo flotando en la superficie
- luego añade otro lienzo como la máscara de ese lienzo de relleno (addChild() y set m pedir a la propiedad)
Aquí hay un código:
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 los enlaces no funciona para mí, tal vez usted quiere decir en este tema: http://forums.adobe.com/message/47864 # 47864 – Tom