Живые обои для Android
Я учусь делать живые обои, но у меня есть дилемма, я уверен, что у всех, кто начинает, тоже есть.
Разрешение экрана очень велико, как я могу сделать один набор иллюстраций для изменения масштаба в коде для всех версий? Я знаю, что это было сделано, так как я видел изображения в apk на многих из них, и они масштабируются.
Если бы это было только одно изображение, которое не требовало легкого позиционирования, но моя проблема в том, что мне нужно изменить масштаб фонового изображения, чтобы оно подходило для всех устройств, у меня также есть анимация, которая помещается в определенную позицию x и y на этом фоне. изображение, которое нужно разместить на месте, чтобы было похоже, что весь фон анимирован, но только его части (мой способ держаться подальше от 300 изображений покадровых живых обоев).
Таким образом, фоновое изображение должно быть изменено, а анимация - в точном процентном соотношении с фоновым изображением, и они должны находиться в определенной позиции x и y.
Буду признателен за любую помощь, чтобы я мог получить это.
Я устал от нескольких вещей, подумал, что сделаю масштабатор для всего, например: int scaler; затем в onSurfaceChanged scaler = width /1024; // если увеличенное изображение - 1024. это даст мне соотношение для работы везде. затем масштабируйте соответственно, используя scaleBitmap, умножив масштабер на высоту и ширину изображения, а также используйте тот же масштабер для позиционирования. Пример изображения x, скажем, на 50, масштабируйте его, используя то же самое x = scaler * 50; это должно заботиться о масштабировании и позиционировании, просто как перевести все это на Java, это следующий урок, так как я новичок в Java, я привык программировать для flash и php, но это сильно отличается, нужно привыкнуть к, Следующая вещь - это как панорамирование ширины, когда вы перемещаете экран из стороны в сторону, как сделать так, чтобы изображение показывалось, это следующая головоломка, которую я понял. Прямо сейчас он показывает одинаковую ширину, несмотря на то, что ширина вдвое больше, чем на поверхности. Если у вас есть ответ или где-нибудь, я могу узнать информацию по этому вопросу, которая будет принята с благодарностью.
2 ответа
Ну, все, что я могу сказать, это "Добро пожаловать в реальный мир". Вы получаете размеры экрана через onSurfaceChanged, и да, ваша задача - выяснить, как масштабировать все на основе этих данных. Вот почему они платят нам большие деньги.:-) Вы захотите убедиться, что ваши ресурсы достаточно велики, чтобы соответствовать большому дисплею, который вы намереваетесь поддерживать, поэтому вы всегда будете сжимать вещи (что искажает гораздо меньше, чем расширения).
Предлагаем начать с "лучших практик для независимости экрана" здесь: http://developer.android.com/guide/practices/screens_support.html
Дополнительные комментарии по вашей просьбе о дополнительной помощи...
- Вы не можете (обязательно) масштабировать свою работу, просто используя ширину, потому что вам нужно поддерживать несколько форматов изображения. Если пропорции экрана не соответствуют вашей иллюстрации, вы должны решить, хотите ли вы исказить ее, оставить пустые места и т. Д.
- Я не уверен, как интерпретировать вашу проблему, передавая размеры экрана. Большинство из нас помещают весь наш активный код в один класс движка, поэтому наши методы могут обмениваться данными через закрытые переменные. Например, в обоях Cube в SDK onSurfaceChanged() устанавливает mCenterX для последующего использования в drawCube(). Я предлагаю начать с аналогичного, простого подхода.
- Обработка прокрутки требует некоторого "интеллекта" и тщательной оценки данных, которые вы получаете через 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 Это не "простое" кодирование - приложения легче, чем обои.:-)
Удачи... Джордж
PS Я добавлю еще одну вещь: где-нибудь вдоль линии вы можете захотеть получить "желаемую минимальную ширину" обоев, необходимую для запуска, чтобы вы могли явно понимать виртуализацию, скрытую в xPixels. Например, в моем конструкторе движка у меня есть
mContext = getApplicationContext();
mWM = WallpaperManager.getInstance(mContext);
mDW = mWM.getDesiredMinimumWidth();
Мое устройство имеет ширину 320 пикселей; Я получаю mDW = 640; когда я прокручиваю от экрана к экрану, xPixels каждый раз изменяется на 80... потому что четыре прокрутки (на пяти экранах) должны удвоить количество обнаруженных иллюстраций (этот эффект называется "прокруткой параллакса"). Самый правый раздел имеет xPixels равный 0; центр (из пяти) секций имеет xPixels = -160 и т. д.
Я использовал этот фрагмент кода, чтобы масштабировать одно изображение, чтобы соответствовать разным размерам экрана.
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);
Убедитесь, что края не содержат важной информации, так как она будет уменьшена на изображении на некоторых экранах.