Прокручиваемые области в визуализации ActionScript 3
-
03-07-2019 - |
Вопрос
Каков наилучший способ создания нескольких прокручиваемых областей в визуализации ActionScript 3, которая расширяет flash.display.Sprite и использует иерархию низкоуровневых объектов DisplayObjects (Sprite'a, Shape's, TextField)? Р>
Я пытался использовать три объекта mx.containers.Canvas, добавленных в качестве дочерних элементов основного Sprite, а также пытался преобразовать основной Sprite в Canvas, но не могу получить что-либо для отображения с использованием любого из этих методов. Я также попытался добавить свои объекты DisplayObject, используя как Canvas.addChild, так и Canvas.rawChildren.addChild. Р>
Необходимо / возможно ли переписать все это для использования компонентов mx. * или есть хитрость для отображения большего количества примитивных объектов внутри объекта Canvas?
Вот пример кода для работы с использованием спрайтов. Мы хотели бы сделать прокрутку _colSprite, _rowSprite и _mapSprite со связанными полосами прокрутки. Когда я преобразую их в объекты Canvas, код беззвучно зависает перед рисованием любых экранных объектов (в строках addChild, если я правильно помню).
Ниже приведен фрагмент кода. Это все из одного класса ActionScript, который расширяет спрайт.
Настройка трех регионов, которые я хочу прокрутить:
this._log("Creating Sprites");
this._colSprite = new Sprite();
this._colSprite.y=0;
this._colSprite.x=this._rowLabelWidth + this._rowLabelRightPadding + this._horizontalPadding;
this._rowSprite = new Sprite();
this._rowSprite.y=this._columnLabelHeight+this._columnLabelBottomPadding + this._verticalPadding;
this._rowSprite.x=this._horizontalPadding;
this._mapSprite = new Sprite();
this._mapSprite.y=this._columnLabelHeight+this._columnLabelBottomPadding+ this._verticalPadding;
this._mapSprite.x=this._rowLabelWidth + this._rowLabelRightPadding+this._horizontalPadding;
this._log("adding kids");
addChild(this._mapSprite);
addChild(this._rowSprite);
addChild(this._colSprite);
Пример функции рисования:
private function _drawColumLabels(colStartIndex: int): void {
for (var col : int = colStartIndex; col < myData.g.length; col++) {
var colName : String = this.myData.g[col].label;
var bottomLeftPoint : Object = this._getCellXYTopLeft(0, col);
bottomLeftPoint.y = this._columnLabelHeight + this._verticalPadding;
var centerX : int = Math.round(this._cellWidth / 2 + (this._fontHeight / 2) - 1);
var colLabel : TextField = new TextField();
colLabel.defaultTextFormat = this._labelTextFormat;
colLabel.width = this._columnLabelHeight+this._columnLabelBottomPadding;
colLabel.text = colName;
colLabel.embedFonts = true;
var colSprite : Sprite = new Sprite();
colSprite.addChild(colLabel);
colSprite.x = bottomLeftPoint.x;
colSprite.y = bottomLeftPoint.y;
colSprite.rotation = -45;
this._colSprite.addChild(colSprite);
}
}
Решение
После добавления дочерних элементов в каждый Canvas вам может потребоваться вызвать Canvas.invalidateSize () (для каждого), чтобы заставить их пересчитать размер.
Необходимость сделать это зависит от того, на какой стадии в жизненном цикле компонента вы добавляете дочерние элементы, т. е. когда вы вызываете '_drawColumLabels'.
Я предполагаю, что вы хотите, чтобы полоса прокрутки появлялась на _colSprite (и _rowSprite), если в ней больше меток, чем можно отобразить в видимой области? В этом случае вам нужно использовать что-то отличное от Sprite, например Canvas, поскольку Sprite не поддерживает прокрутку.
Возможно, вы также захотите отладить значения x / y / width / height каждого из ваших компонентов, чтобы убедиться, что они соответствуют вашим ожиданиям. Я считаю полезным при создании макета нарисовать макет на бумаге и начать писать размеры и координаты, чтобы я мог видеть, что мои расчеты верны.