Используйте полное разрешение iPhone X в приложении Adobe AIR [дубликат]

Существует более эффективное и менее громоздкое решение для целых чисел, чем Collections.shuffle.

Проблема такая же, как последовательная выбор предметов из только не выбранных элементов в наборе и установка их в закажите где-нибудь еще. Это точно так же, как случайное обращение с картами или розыгрыш лотереи, выигранных из шляпы или бина.

Этот алгоритм работает для загрузки любого массива и достижения случайного порядка в конце загрузки. Он также работает для добавления в коллекцию List (или любой другой индексированной коллекции) и достижения случайной последовательности в коллекции в конце добавлений.

Это можно сделать с помощью одного массива, созданного один раз, или с помощью численного заказа, например списка. Для массива размер исходного массива должен быть точного размера, чтобы содержать все заданные значения. Если вы не знаете, сколько значений может произойти заблаговременно, использование набора с упорядоченным числом, например ArrayList или List, где размер не является неизменным, также будет работать. Он будет работать универсально для массива любого размера до Integer.MAX_VALUE, который составляет чуть более 2 000 000 000. Объекты списка будут иметь одинаковые пределы индекса. Когда вы дойдете до массива такого размера, на вашем компьютере может закончиться нехватка памяти. Может быть более эффективным загрузить массив, набранный для типов объектов, и преобразовать его в некоторую коллекцию после загрузки массива. Это особенно верно, если целевая коллекция не индексируется численно.

Этот алгоритм, точно так же, как написано, создаст очень ровное распределение, где дубликатов нет. Один из аспектов, который ОЧЕНЬ ВАЖНО, заключается в том, что он должен иметь возможность вхождения следующего элемента в текущий текущий размер + 1. Таким образом, для второго элемента можно было бы сохранить его в местоположении 0 или местоположении 1 . Для 20-го элемента можно сохранить его в любом месте, от 0 до 19. Как можно больше первый элемент останется в местоположении 0, так как он может оказаться в любом другом месте. Это возможно, так как следующий новый пункт отправится куда угодно, включая следующее новое место.

Случайность последовательности будет такой же случайной, как случайность генератора случайных чисел.

Этот алгоритм также можно использовать для загрузки ссылочных типов в случайные местоположения в массиве. Поскольку это работает с массивом, он также может работать с коллекциями. Это означает, что вам не нужно создавать коллекцию, а затем перетасовывать ее или заказывать при любых заказах вставляемые объекты. Коллекция должна иметь возможность вставлять элемент в любом месте коллекции или добавлять его.

// RandomSequence.java
import java.util.Random;
public class RandomSequence {

    public static void main(String[] args) {
        // create an array of the size and type for which
        // you want a random sequence
        int[] randomSequence = new int[20];
        Random randomNumbers = new Random();

        for (int i = 0; i < randomSequence.length; i++ ) {
            if (i == 0) { // seed first entry in array with item 0
                randomSequence[i] = 0; 
            } else { // for all other items...
                // choose a random pointer to the segment of the
                // array already containing items
                int pointer = randomNumbers.nextInt(i + 1);
                randomSequence[i] = randomSequence[pointer]; 
                randomSequence[pointer] = i;
                // note that if pointer & i are equal
                // the new value will just go into location i and possibly stay there
                // this is VERY IMPORTANT to ensure the sequence is really random
                // and not biased
            } // end if...else
        } // end for
        for (int number: randomSequence) {
                System.out.printf("%2d ", number);
        } // end for
    } // end main
} // end class RandomSequence
1
задан BadFeelingAboutThis 10 December 2015 в 00:49
поделиться

2 ответа

ЗАПИСЬ ИЗОБРАЖЕНИЙ

Прежде всего, вам нужно убедиться, что у вас есть правильные изображения запуска, включенные в ваш проект.

Вот таблица из Adobe сайт :

  • По умолчанию ~ iphone.png | iPhone 4 (не сетчатка) 640 x 960 Potrait
  • Default@2x~iphone.png | iPhone 4, 4s 640 x 960 Potrait
  • Default-568h@2x~iphone.png | iPhone 5, 5c, 5s 640 x 1136 Potrait
  • По умолчанию 375w-667h@2x~iphone.png | iPhone 6/7/8 750 x 1334 Potrait
  • По умолчанию 414w-736h@3x~iphone.png | iPhone 6 + / 7 + / 8 + 1242 x 2208 Potrait
  • Default-Landscape-414w-736h@3x~iphone.png | iPhone 6 + / 7 + / 8 + 2208 x 1242 Пейзаж
  • Default-Landscape-812h@3x~iphone.png | iPhone X 2436 x 1125 Пейзаж
  • По умолчанию 812h@3x~iphone.png | iPhone X 1125 x 2436 Портрет

После того, как вы сделали эти изображения (и назвали точно так, как показано), включите их в свой проект (они должны быть в root вашего приложения), выполнив следующие действия:

В FlashPro

  • перейдите к настройкам публикации
  • , перейдите к Настройки AIR для iOS.
  • Перейдите на вкладку «Общие»
  • , добавьте все эти изображения в список «включенные файлы» (корень)

SCALING YOUR CONTENT

  • ВАРИАНТ 1, ЗАПОЛНЕНИЕ И ПОДГОТОВКА

Если вы не против обрезки ваш контент немного, вы можете просто сделать это, когда начнется ваше приложение:

stage.scaleMode = StageScaleMode.NO_BORDER

Это уменьшит ваш swf, чтобы он заполнил весь экран, сохраняя пропорции. Довольно легко понять, сколько отступов вам нужно, чтобы этот метод работал хорошо для небольших вариаций пропорций для различных iPhone.

Однако, если вы хотите разрешить изменения ориентации (портретный пейзаж) , обрезка, вероятно, будет слишком серьезной.

  • ВАРИАНТ 2 - РЕСПОНДИВНЫЙ ДИЗАЙН

. Наилучший способ размещения различных разрешений экрана и соотношения сторон, однако, состоит в том, чтобы сделайте ваше приложение отзывчивым. Это включает следующий код в начале вашего приложения:

stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align     = StageAlign.TOP_LEFT;

Теперь ваши оценки сцены (stage.stageWidth & amp; stage.stageHeight) будут иметь полную ширину и высоту устройства *. (на некоторых устройствах есть панель инструментов внизу или верхняя полоса).

Затем вы можете позиционировать вещи через код.

Если вы хотите, чтобы простой способ конвертировать то, что у вас есть (вы не хотите использовать код для изменения размера и выравнивания абсолютно всех), просто поместите весь свой контент в контейнер MovieClip с именем экземпляра container, вы можете его размер и положение следующим образом:

//scale the container as big as possible while still fitting entirely in the screen:

//figure out which dimension should match the stage (widht or height)
if(container.width - stage.stageWidth >= container.height - stage.stageHeight){
    container.width = stage.stageWidth;
    container.scaleY = container.scaleX;
}else {
    container.height = stage.stageHeight
    container.scaleX = container.scaleY;
}

//center it on the screen:
container.x = (stage.stageWidth - container.width) * 0.5;
container.y = (stage.stageHeight - container.height) * 0.5;

Также рекомендуется прослушивать события изменения размера, в случае изменения размера экрана (например, вы максимизируете / восстанавливаете на рабочем столе или переходите от портрета к пейзажу на мобильном устройстве).

Вы делаете это по прослушивание события изменения размера на сцене:

stage.addEventListener(Event.RESIZE, redrawScreen);

function redrawScreen(e:Event):void {
    //resize everything as the window size has changed.
}
4
ответ дан BadFeelingAboutThis 16 August 2018 в 02:01
поделиться
  • 1
    Благодарю. Я только что попробовал stage.scaleMode = StageScaleMode.NO_BORDER, но ничего не изменилось? У меня все еще есть черные бары? – Cal 8 December 2015 в 21:38
  • 2
    Где есть код? Он должен быть в первом кадре вашей временной шкалы времени, если вы используете временные рамки. Кроме того, вам необходимо развертывать AIR 3.5 или новее. – BadFeelingAboutThis 8 December 2015 в 22:23
  • 3
    У меня есть код в слое под названием «действия», он находится в первом кадре на временной шкале. Этот кадр содержит только небольшой код. Независимо от того, какой режим масштабирования я вставляю, ничего не меняется, когда я публикую его на своем iPhone. Я не получаю сообщений об ошибках, но, похоже, это не влияет. Я запускаю AIR 17.0. – Cal 9 December 2015 в 02:31
  • 4
    Вы импортируете классы, на которые вы ссылаетесь? import flash.display.StageScaleMode; должно дать вам ошибку, хотя если это была проблема. Хотелось бы, чтобы у меня было устройство ios, с которым можно было протестировать, прошло несколько лет с тех пор, как я сделал любую работу в iOS. Он работает на рабочем столе? – BadFeelingAboutThis 9 December 2015 в 05:38
  • 5
    Да, я импортирую это. На рабочем столе, похоже, работает, когда я изменяю его размер, тогда он изменяет размер остальной части (с небольшим количеством обрезки). Ничего не происходит, просто черные полосы, когда я помещаю его на iPhone. – Cal 9 December 2015 в 18:58

Вы, кодер, отвечаете за предоставление различных решений для разных размеров экрана. Вы проверяете размер устройства, а затем представляете контент соответствующим образом. В целом, это не так, чтобы отличать контент от ротации. Если вы надеетесь на волшебное решение, которое сделает все, что для вас в AIR, вам не повезло, потому что его нет.

Не рекомендуется использовать сценарные скальмоды (вы всегда должны использовать шкалу на мобильном устройстве), так как тогда вы полностью отказываетесь от возможности сравнивать позицию вашего объекта отображения в соответствии с реальным размером физического устройства (в основном вы не будет знать точно, что бы вы не отображали на экране или полностью из него).

Если вы считаете, что разработка для мобильных устройств была простой (не только с использованием AIR, но с использованием любой технологии), тогда извините, это не особенно важно, потому что вы должны обрабатывать все эти размеры.

Основной принцип о том, как с этим бороться:

  1. получить реальный размер устройства.
  2. рассчитать реальную плотность / отношение.
  3. Сравните этот размер с размером вашего приложения. (снова масштабируйте режим без масштабирования)
  4. Извлеките общее соотношение (размер вашего приложения по сравнению с размером устройства)
  5. Используйте это соотношение для масштабирования и размещения основного контейнера ( контейнер, который содержит все ваше приложение), жесткий: масштабировать и размещать весь ваш DisplayObject в вашем приложении.
  6. Так как отношение приложения поддерживается, заполните пустое пространство любым.
  7. Ваше приложение правильно заполняет весь экран на любом устройстве.
0
ответ дан BotMaster 16 August 2018 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: