#apache-flex #canvas
#apache-flex #холст
Вопрос:
Размер контейнера Flex Canvas ограничен размером 10 000×10 000 пикселей. Тем не менее, я видел гибкие приложения, которые прокручиваются более чем на 10 000 пикселей. Есть идеи, как это можно сделать?
Содержимое, которое я хочу прокрутить, уже разбито на части, но мне нужно добавить эти части к чему-то, что может прокручиваться по вертикали более чем на 10 000 пикселей.
Комментарии:
1. На самом деле у Canvas нет такого ограничения, как максимальный размер 10kx10k. Как вы до этого додумались?
2. Эй, ты прав! Забавная вещь; если вы перейдете к чтению о Canvas, он рекомендует использовать 2 контейнера Spark, и оба они ограничены размером 10 на 10 кб … очень странно. Спасибо.
3. На самом деле я мало занимался программированием на Flex 4, но из некоторых фрагментов кода, которые я написал, чтобы проверить это ограничение размером 10 на 10, я могу ясно видеть, что Group также никоим образом не ограничена — она с радостью установит себе, скажем, высоту 20 кб.
Ответ №1:
В зависимости от того, что вы на самом деле хотите отобразить, вы можете разбить свой контент на плитки. Вот как работает Google Maps: при каждом перемещении карты программа определяет, какие плитки видны на экране, и загружает их. Все маркеры или наложения, которые есть на карте, уведомляются о перемещении карты и определяют, где находится их новое местоположение. Если их местоположение находится за пределами экрана, они могут быть удалены с холста. Например, ширина всех фрагментов при 20-м уровне масштабирования на Картах Google составляет (256 пикселей * 2 ^ 20), что составляет 268 435 456 общих пикселей.
По сути, вам просто нужно создать специальный спрайт, который отслеживает фактическое местоположение x, y, в котором он должен быть размещен. Каждый раз, когда контейнер перемещается, вы просто перебираете все дочерние объекты и определяете, куда их поместить.
function onCanvasScroll() {
//determine the top left coordinates of the canvas
//you will figure out how to do this depending on how the scrolling window
//is implemented
var canvas_scroll_x;
var canvas_scroll_y;
//create a bounding box for the canvas
var view_bounds = new Rectangle(canvas_scroll_x, canvas_scroll_y, canvas.width, canvas.height);
for (child in canvas) {
var x = child.actual_x - view_bounds.x;
var y = child.actual_y - view_bounds.y;
var childBounds = new Rectangle(x, y, child.width, child.height);
//determine if the component is visible on screen
if (view_bounds.intersects(child_bounds)) {
child.visible = true;
child.x = x;
child.y = y;
}
else {
child.visible = false;
}
}
}
Итак, если у вас есть холст, который расположен на (100, 20000), спрайт, который расположен на (300, 20100), и окно, которое (640,408), вы бы разместили его на (200, 100), и оно было бы видно на экране.
Вместо того, чтобы просто устанавливать значение visible равным true или false, лучшим подходом было бы полностью удалить элементы с canvas, когда они не находятся в пределах видимости.
Комментарии:
1. Здравствуйте. Интересно. Я этого еще не пробовал. Но мне интересно о полосах прокрутки. Как они будут изменять размер и прокручивать в соответствии с содержимым?
2. Я должен думать, что пришлось бы определять размер содержимого и устанавливать размер полос прокрутки вручную. Если полосы прокрутки на самом деле не привязаны к холсту, то я думаю, вы можете просто изменить размер ползунков. Мой опыт работы с обычным actionscript, а не с flex, поэтому я не уверен, как flex работает в этом отношении.