Для начала, для ясности, разберемся, откуда берется загадочный белый квадрат: откроем файл Container.as.
[geshi lang=Actionscript] // Create or destroy the whiteBox.
// If both scrollBars are active, there's an empty space
// between the two scrollBars in the lower right corner.
// The whiteBox fills that space, so that the container's
// children aren't visible when they scroll underneath.
if (horizontalScrollBar && verticalScrollBar)
{
if (!whiteBox)
{
whiteBox = new FlexShape();
whiteBox.name = "whiteBox";
var g:Graphics = whiteBox.graphics;
g.beginFill(0xFFFFFF);
g.drawRect(0, 0, verticalScrollBar.minWidth, horizontalScrollBar.minHeight);
g.endFill()
rawChildren.addChild(whiteBox);
}
}
[/geshi]
Вот код, создающий этот белый квадрат. Само по себе его присутствие - для меня необъяснимая загадка. Хорошие новости - переменная whiteBox во Flex 3 объявлена как protected, в то время как во Flex 2 - она private. Впрочем, привожу в любом случае решение, которое будет работать и во Flex 2 и во Flex 3.
[geshi lang=Actionscript]
private function removeWhiteBox(): void {
var wb: DisplayObject = rawChildren.getChildByName("whiteBox");
if (wb)
wb.alpha = 0;
}
override public function validateDisplayList(): void {
super.validateDisplayList();
removeWhiteBox();
}
override protected function createChildren():void {
super.createChildren();
removeWhiteBox();
}
[/geshi]
Существует и другое решение: можно обрабатывать событие added, например так:
[geshi lang=Actionscript]
private function whiteBoxCheck(event:Event):void {
if (event.target.name == "whiteBox") {
FlexShape(event.target).alpha = 0;
}
}
override protected function createChildren():void {
addEventListener(Event.ADDED, whiteBoxCheck);
super.createChildren();
}
[/geshi]
В Сети можно найти альтернативное "решение" проблемы - удалять whiteBox. Ни к чему хорошему это не приводит, к сожалению - когда Flex будет удалять этот злосчастный белый квадрат самостоятельно, - будет ошибка. Если вашему скину требуется модификация белого квадрата, можно вместо удаления воспользоваться следующей техникой:
[geshi lang=Actionscript]
var wb: FlexShape = rawChildren.getChildByName("whiteBox") as FlexShape;
var graphics: Graphics = wb.graphics;
// и рисовать на этом graphics все, что угодно :-)
[/geshi]
Само собой разумеется, лучший способ - это переопределение этих функций в классе-наследнике, так как перекомпиляция Flex - затея не самая лучшая. Например, если вы используете FlowBox из FlexLib (подробнее в статье про FlowBox), можно переопределить эти методы в классе FlowBox.