Всем привет. Сегодня хотел бы поделиться приемом создания живой обоины под 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>
Перед запуском живой обои добавим в список узлов приложения класс преднастроек:

Обоина готова к запуску