Всем привет. Сегодня хотел бы поделиться приемом создания живой обоины под Android 2.1 c возможностью прокрутки изображения.
Предлагаю определится с environment-ом без отлагательств и приступить к кодингу в Eclipse, тестированию в Android SDK and AVD Manager эмуляторе, и заливке на телефон, который по интерактивности (меньше касаний для звонка, быстрая навигация via GoogleMaps с возможностью позвонить) сейчас мне больше напоминает телефон-навигатор. Кто знает, может быть после очередной итерации под кодовым названием froyo гуглы подумают о создании 2D записной книги, развернув ее на карту?
Опишу создание приложения from scratch для тех кто newbie. Вам понадобится Android JDK a также ADT ну и Eclipse само собой. Сложностей с установкой плагина который ADT for Eclipse у меня не было, и у вас не будет значит. После перезагрузки IDE во вкладке Windows появится «Android SDK and AVD Manager». Создавайте новый эмулятор устройства с API Level 7, то есть Android 2.1 ну или API Level 8, Android 2.2, но не ниже, так как Live Wallpaper feature в ранних версиях попросту не было.
В нашем приложении в качестве картинки используется jpg размером 640х533. Замостить ею весь экран невозможно, в таких случаях поможет скроллинг. Предлагаю сфокусироваться лишь на горизонтальной прокрутке, которую вы организовываете как в пределах к примеру основного хомскрина, так и переходе на соседние. В тестируемом девайсе HTC Desire, к слову, имеется 7 хомскринов, поэтому наверное не имеет смысла ограничиваться лишь фронтальным. Вы конечно же понимаете, что одно и тоже изображение будет иметь разный вид на устройстве c density 240, 160 и 120, поэтому важно заранее знать диагональ экрана и плотность, если ваша апликуха не способна сама определять эти параметры ну или если вы не ставите себе такую задачу, нацеливаясь на определенную модель. В обоих случаях связь между физическими и отображаемыми размерами рассчитываются по формулам:
realScreenWidht=screenWidth/(density/160)
realScreenHeight=screenHeight/(density/160),
то есть для HTC Desire с WVGA dimension (480x800), и диагональню 3.3"-4.0", (with high density, hdpi, 240) расчет размера нужной нам картинки, которая по высоте занимает весь экран, выглядит следующим образом:
density/160 = 1.5
realScreenHeight=800/1.5=533
По ширине размер картинки занимает 2 хомскрина, следовательно
realScreenWidht=480*2/1.5=640
То есть с теорией и окружением разобрались, предлагаю создать Android проект с именем ScrollableLiveWallpaper, выбрав Build Target как Android 2.1. Application name устанавливается как ScrollableLiveWallpaper, package — com.scrollable.live.wallpaper. В поле имени Activity вводится имя (проекта, в нашем случае) с постфиксом, то есть ScrollableLiveWallpaperActivity, согласно негласному name convention.
Далее займемся превращением кокона (Activity) в бабочку (Live Wallpaper), для чего откроем AndroidManifest.xml, напрочь забывая про ScrollableLiveWallpaperActivity.java. Во вкладке Application нам интересно убедиться что в поле узлов приложения указан класс ScrollableLiveWallpaperActivity, удаляем его со всеми атрибутами и фильтрами системных событий. Живая обоина является сервисом, который создается просто:
в новом классе ScrollableLiveWallpaperService наследуемся от WallpaperService. Обязательный для имплементации метод нужен лишь для того, чтобы запустить движок ScrollableLWEngine
Давайте вернемся в AndroidManifest.xml и добавим в узлы сервис:
фильтр
и метаданные, нужные для создания Preference Screen
В папке res создаем xml/scrollable.xml:
создаем класс ScrollablePreferences в пакете com.scrollable.live.wallpaper.preferences:
Preferences Screen Activity почти прикручен к сервису. Осталось создать preferences.xml в res/xml:
В strings.xml добавляем
Preferences Screen будет содержит вертикальный список из 7 radiobutton элементов, имя и значение каждого из которых хранятся в ресурсе под названием values/array.xml:
Перед запуском живой обои добавим в список узлов приложения класс преднастроек:
Обоина готова к запуску
Предлагаю определится с environment-ом без отлагательств и приступить к кодингу в Eclipse, тестированию в Android SDK and AVD Manager эмуляторе, и заливке на телефон, который по интерактивности (меньше касаний для звонка, быстрая навигация via GoogleMaps с возможностью позвонить) сейчас мне больше напоминает телефон-навигатор. Кто знает, может быть после очередной итерации под кодовым названием froyo гуглы подумают о создании 2D записной книги, развернув ее на карту?
Опишу создание приложения from scratch для тех кто newbie. Вам понадобится Android JDK a также ADT ну и Eclipse само собой. Сложностей с установкой плагина который ADT for Eclipse у меня не было, и у вас не будет значит. После перезагрузки IDE во вкладке Windows появится «Android SDK and AVD Manager». Создавайте новый эмулятор устройства с API Level 7, то есть Android 2.1 ну или API Level 8, Android 2.2, но не ниже, так как Live Wallpaper feature в ранних версиях попросту не было.
В нашем приложении в качестве картинки используется jpg размером 640х533. Замостить ею весь экран невозможно, в таких случаях поможет скроллинг. Предлагаю сфокусироваться лишь на горизонтальной прокрутке, которую вы организовываете как в пределах к примеру основного хомскрина, так и переходе на соседние. В тестируемом девайсе HTC Desire, к слову, имеется 7 хомскринов, поэтому наверное не имеет смысла ограничиваться лишь фронтальным. Вы конечно же понимаете, что одно и тоже изображение будет иметь разный вид на устройстве c density 240, 160 и 120, поэтому важно заранее знать диагональ экрана и плотность, если ваша апликуха не способна сама определять эти параметры ну или если вы не ставите себе такую задачу, нацеливаясь на определенную модель. В обоих случаях связь между физическими и отображаемыми размерами рассчитываются по формулам:
realScreenWidht=screenWidth/(density/160)
realScreenHeight=screenHeight/(density/160),
то есть для HTC Desire с WVGA dimension (480x800), и диагональню 3.3"-4.0", (with high density, hdpi, 240) расчет размера нужной нам картинки, которая по высоте занимает весь экран, выглядит следующим образом:
density/160 = 1.5
realScreenHeight=800/1.5=533
По ширине размер картинки занимает 2 хомскрина, следовательно
realScreenWidht=480*2/1.5=640
То есть с теорией и окружением разобрались, предлагаю создать Android проект с именем ScrollableLiveWallpaper, выбрав Build Target как Android 2.1. Application name устанавливается как ScrollableLiveWallpaper, package — com.scrollable.live.wallpaper. В поле имени Activity вводится имя (проекта, в нашем случае) с постфиксом, то есть ScrollableLiveWallpaperActivity, согласно негласному name convention.
Далее займемся превращением кокона (Activity) в бабочку (Live Wallpaper), для чего откроем AndroidManifest.xml, напрочь забывая про ScrollableLiveWallpaperActivity.java. Во вкладке Application нам интересно убедиться что в поле узлов приложения указан класс ScrollableLiveWallpaperActivity, удаляем его со всеми атрибутами и фильтрами системных событий. Живая обоина является сервисом, который создается просто:
в новом классе ScrollableLiveWallpaperService наследуемся от WallpaperService. Обязательный для имплементации метод нужен лишь для того, чтобы запустить движок ScrollableLWEngine
public class ScrollableLiveWallpaperService extends WallpaperService{ public static final String SHARED_PREFS_NAME="settings"; @Override public Engine onCreateEngine() { return new ScrollableLWEngine(); } class ScrollableLWEngine extends Engine implements OnSharedPreferenceChangeListener { @Override public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) { } } }
Давайте вернемся в AndroidManifest.xml и добавим в узлы сервис:
фильтр
и метаданные, нужные для создания Preference Screen
В папке res создаем xml/scrollable.xml:
<?xml version="1.0" encoding="utf-8"?> <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:thumbnail="@drawable/icon" android:description="@string/app_name" android:settingsActivity="com.scrollable.live.wallpaper.preferences.ScrollablePreferences"/>
создаем класс ScrollablePreferences в пакете com.scrollable.live.wallpaper.preferences:
public class ScrollablePreferences extends PreferenceActivity implements OnSharedPreferenceChangeListener{ @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); getPreferenceManager(). setSharedPreferencesName(ScrollableLiveWallpaperService.SHARED_PREFS_NAME);
addPreferencesFromResource(R.xml.preferences);
getPreferenceManager(). getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { } @Override protected void onResume() { super.onResume(); } @Override protected void onDestroy() { getPreferenceManager(). getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); super.onDestroy(); } }
Preferences Screen Activity почти прикручен к сервису. Осталось создать preferences.xml в res/xml:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="@string/settings" android:key="Scrollable_settings"> <ListPreference android:key="key_speed_scroll" android:title="@string/settings_scroll_speed_title" android:summary="@string/settings_scroll_speed_summary" android:entries="@array/speed_scroll_keynames" android:entryValues="@array/speed_scroll_keyvalues" /> </PreferenceScreen>
В strings.xml добавляем
<string name="settings">Settings</string> <string name="settings_scroll_speed_title">Select Scroll Speed</string> <string name="settings_scroll_speed_summary">Choose speed of the scrolling</string>
Preferences Screen будет содержит вертикальный список из 7 radiobutton элементов, имя и значение каждого из которых хранятся в ресурсе под названием values/array.xml:
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string-array name="speed_scroll_keynames"> <item>"First"</item> <item>"Second"</item> <item>"Third"</item> <item>"Fourth"</item> <item>"Fifs"</item> <item>"Sixth"</item> <item>"Seventh"</item> </string-array> <string-array name="speed_scroll_keyvalues"> <item>"1"</item> <item>"2"</item> <item>"3"</item> <item>"4"</item> <item>"5"</item> <item>"6"</item> <item>"7"</item> </string-array> </resources>
Перед запуском живой обои добавим в список узлов приложения класс преднастроек:
Обоина готова к запуску