Pull to refresh

Как создать Scrollable Live Wallpaper под Android 2.1 (часть Первая, она же Предпоследняя)

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

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 и добавим в узлы сервис:
1

фильтр
2

и метаданные, нужные для создания Preference Screen
3

В папке 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>

Перед запуском живой обои добавим в список узлов приложения класс преднастроек:
4
    Обоина готова к запуску
Tags:
Hubs:
-23
Comments5

Articles