живые обои для Android - PullRequest
       19

живые обои для Android

3 голосов
/ 06 марта 2011

Я учусь делать живые обои, но у меня есть дилемма, я уверен, что у всех, кто начинает, тоже есть.

Существует столько размеров экрана с разрешением, как я могу сделать один набор иллюстраций для изменения масштаба в коде для всех версий? Я знаю, что это было сделано, поскольку я видел изображения в apk на многих из них, и они масштабируются.

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

Таким образом, фоновое изображение должно быть изменено, а анимация - в точном процентном соотношении с фоновым изображением, и они должны находиться в определенной позиции x и y.

Буду признателен за любую помощь, чтобы я мог это сделать.


Я устал от нескольких вещей, подумал, что сделаю масштабатор для всего, например: int scaler; затем в onSurfaceChanged scaler = width / 1024; // если увеличенное изображение - 1024. это даст мне соотношение для работы везде. затем масштабируйте соответственно, используя scaleBitmap, умножив масштабер на высоту и ширину изображения, а также используйте тот же масштабер для позиционирования. Пример изображения x, скажем, на 50, масштабируйте его, используя то же самое x = scaler * 50; это должно заботиться о масштабировании и позиционировании, просто как перевести все это на java - следующий урок, так как я новичок в java, я программировал для flash и php, но это сильно отличается, нужно привыкнуть к , Следующая вещь - это как панорамирование ширины, когда вы перемещаете экран из стороны в сторону, как сделать так, чтобы изображение показывалось, это следующая головоломка, которую я понял. Прямо сейчас он показывает одинаковую ширину, несмотря на то, что ширина вдвое больше, чем на поверхности. Если у вас есть ответ или где-нибудь еще, я могу узнать информацию по этому вопросу, которая будет принята с благодарностью.

Ответы [ 2 ]

12 голосов
/ 18 марта 2011

Ну, все, что я могу сказать, это "Добро пожаловать в реальный мир". Вы получаете размеры экрана через onSurfaceChanged, и да, ваша задача - выяснить, как масштабировать все на основе этих данных. Вот почему они платят нам большие деньги. :-) Вы захотите убедиться, что ваши ресурсы достаточно велики, чтобы соответствовать большому дисплею, который вы намереваетесь поддерживать, поэтому вы всегда будете сжимать вещи (что искажает гораздо меньше, чем расширяются).

Предлагаем начинать с "лучших практик для независимости экрана" здесь: http://developer.android.com/guide/practices/screens_support.html

Дополнительные комментарии по вашему запросу для получения дополнительной помощи ...

  1. Вы не можете (обязательно) масштабировать свою работу, просто используя ширину, потому что вам нужно поддерживать несколько форматов изображения. Если пропорции экрана не соответствуют вашей иллюстрации, вы должны решить, хотите ли вы исказить ее, оставить пустые места и т. Д.
  2. Я не уверен, как истолковать вашу проблему, передавая размеры экрана. Большинство из нас помещают весь наш активный код в один класс движка, поэтому наши методы могут обмениваться данными через закрытые переменные. Например, в обоях Cube в SDK onSurfaceChanged () устанавливает mCenterX для последующего использования в drawCube (). Я предлагаю начать с аналогичного, простого подхода.
  3. Обработка прокрутки требует некоторого «интеллекта» и тщательной оценки данных, которые вы получаете с помощью onOffsetsChanged (). xStep указывает, сколько экранов поддерживает ваша программа запуска. Обычно xStep будет равен 0,25, что означает 5 экранов (т.е. xOffset = 0, 0,25, 0,5, 0,75 или 1), но это может быть любое значение от 0 до 1; 0.5 будет означать 3 экрана. xPixels дает вам представление о том, насколько «лаунчер» хочет, чтобы вы перемещали свои изображения в зависимости от того, на каком экране вы находитесь; обычно вы должны уважать это. На моем телефоне программа запуска «желает» виртуальные обои с двойным пикселем физического экрана, поэтому каждый свиток должен сдвигать только четверть пикселей одного экрана. Все это и многое другое задокументировано в http://developer.android.com/reference/android/app/WallpaperManager.html Это не «легкое» кодирование - приложения легче, чем обои. : -)

Удачи ... Джордж

P.S. Я добавлю еще одну вещь: где-нибудь вдоль линии вы можете захотеть получить «желаемую минимальную ширину» обоев, необходимую для запуска, чтобы вы могли явно понимать виртуализацию, скрытую в xPixels. Например, в конструкторе моего двигателя у меня есть

mContext = getApplicationContext();
mWM = WallpaperManager.getInstance(mContext);
mDW = mWM.getDesiredMinimumWidth();

Мое устройство имеет ширину 320 пикселей; Я получаю mDW = 640; когда я прокручиваю от экрана к экрану, xPixels каждый раз меняется на 80 ... потому что четыре прокрутки (на пяти экранах) должны удвоить количество обнаруженных иллюстраций (этот эффект называется "прокруткой параллакса"). Самый правый раздел имеет xPixels, равный 0; центр (из пяти) секций имеет xPixels = -160 и т. д.

0 голосов
/ 20 октября 2012

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

Bitmap image1, pic1;
image1 = BitmapFactory.decodeResource(getResources(), R.drawable.image1);
float xScale = (float) canvas.getWidth() / image1.getWidth();
                float yScale = (float) canvas.getHeight() / image1.getHeight();
                float scale = Math.max(xScale, yScale); //selects the larger size to grow the images by

                //scale = (float) (scale*1.1); //this allows for ensuring the image covers the whole screen.

                scaledWidth = scale * image1.getWidth();
                scaledHeight = scale * image1.getHeight();

                    pic1 = Bitmap.createScaledBitmap(image1, (int)scaledWidth, (int)scaledHeight, true);

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

...