Объекты, скрытые с помощью ScrollRect Блокировка / запуск событий ввода
Проект написан в формате as3, упакован с использованием AIR 28.0 и запускается на устройстве Android 7 (при запуске в среде рабочего стола Windows он работает нормально).
Объекты, которые скрыты от просмотра с помощью scrollRect, все еще получают события мыши на моем Android 7 (S7), но не тогда, когда я запускаю то же самое приложение в среде рабочего стола.
Это ошибка Android или AIR? Или я что-то не так делаю?
Пример:
EDIT: (Original code example was incomplete see edit below)
var button:Sprite = new Sprite();
button.graphics.beginFill(0x00FF11, 1);
button.graphics.drawRect(0, 0, 50, 50);
button.graphics.endFill();
addChild(button);
button.addEventListener(MouseEvent.CLICK, buttonClick);
var outer:Sprite = new Sprite();
var square:Sprite = new Sprite();
outer.cacheAsBitmap = true;
outer.addChild(square);
var rect:Rectangle = new Rectangle(0, 0, 50, 50);
outer.scrollRect = rect;
addChild(outer);
outer.y = 50;
square.graphics.lineStyle();
square.graphics.beginFill(0x000000, 1);
square.graphics.drawRect(0, 0, 100, 100);
square.graphics.endFill();
square.addEventListener(MouseEvent.MOUSE_DOWN, squareDown);
square.y = -50;
В этом примере прямоугольник, нарисованный во внутреннем объекте, виден только внутри external.scrollRect (т.е. 50x50 вместо 100x100), а объект кнопки виден над ним. Когда событие click происходит над видимой кнопкой, однако происходит событие innerClick, а не событие buttonClick.
Кажется, что невидимая часть внутреннего контейнера, скрытая применяемым scrollRect, скрыта только визуально и все еще блокирует входные события.
Приложение компилируется и устанавливается через мою IDE (Flash Builder). Я пробовал разные версии IDE и AIR SDK с одинаковыми результатами.
Любая помощь будет принята с благодарностью.
РЕДАКТИРОВАТЬ:
Я обнаружил случаи, когда scrollRect работал правильно, поэтому проводил дальнейшее тестирование, чтобы сузить ошибку.
Удаление строки:
outer.cacheAsBitmap = true;
... исправил проблему. Применение cacheAsBitmap к самому квадратному объекту также все еще работало нормально.
По какой-то причине применение cacheAsBitmap к объекту с scrollRect вызывает эту ошибку, но применение cacheAsBitmap к дочерним объектам, расположенным ниже по цепочке, работает должным образом.
Я не достаточно опытен, чтобы знать, что влияет на производительность или почему предлагается добавить cacheAsBitmap к объекту с scrollRect. Может быть, кто-то еще может сообщить.
1 ответ
Свойство scrollRect, вероятно, является наиболее эффективным способом (с обычным содержимым Flash) для обрезки некоторого содержимого с помощью прямоугольной маски.
Свойство cacheAsBitmap позволяет избавить Flash Player от необходимости отображать содержимое объекта, если внутри объекта что-то не изменилось.
Проще говоря. Представьте себе страницу богато иллюстрированной сказочной книги: слишком сложное векторное изображение с множеством деталей, некоторые тексты с причудливыми шрифтами и т. Д. Вы помещаете его на сцену, Flash Player должен визуализировать все это: векторные заливки и обводки, причудливые шрифты, Тогда вы ничего не меняете в течение нескольких кадров, Flash Player не нужно ничего визуализировать, это хорошо. Затем вы сдвигаете эту страницу на 1 пиксель вправо и - угадайте, что - Flash Player необходимо снова отрисовать целиком.
Любое изменение на этой странице, или на этой странице, или на этой странице - что-либо, имеющее ограничивающий прямоугольник этой страницы - заставит FP снова визуализировать весь контент страницы - что может значительно снизить производительность.
Использование cacheAsBitmap позволяет FP отображать его только один раз, поэтому только внутренние изменения на этой странице приведут к повторной визуализации FP, а все остальное заставит FP просто использовать кэшированную версию, что быстрее, чем повторная визуализация. Что, я согласен, может быть решением для мобильных устройств, потому что они медленные и не требуют центрального процессора.
Следовательно, если ваше приложение имеет элементы, которые:
- содержат сложные векторные фигуры и текст
- статичны или меняются довольно редко
- не слишком велики
затем вы можете кэшировать их с помощью cacheAsBitmap = true, чтобы повысить производительность за счет оперативной памяти.
Тем не мение.
Если вы создаете продукт для магазина, а не просто школьный проект или что-то для личного развлечения, я советую вам взглянуть на Gamua Starling, потому что вы никогда не сделаете свое приложение близко к плавной работе с обычным Flash-контентом. Как только вам нужно перерисовать весь экран, FPS упадет на дно моря, потому что Flash требует много ресурсов процессора, а мобильным устройствам не хватает процессора. Starling, с другой стороны, использует ресурсы Stage3D и GPU устройства, так что вы можете получить что-то слишком богатое и анимированное, работающее со скоростью 60 FPS без пота.