Для создания приложения с обоями нам понадобятся прежде всего картинки. Заранее подготовленные картинки назовем и поместим в папки. В каждую папку будут помещены картинки для экранов с разным разрешением - от маленьких до самых больших.
2. AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" .. <uses-permission android:name="android.permission.SET_WALLPAPER"/> </manifest>
3. Разметка страницы с обоями
Для того, чтобы создать листалку с картинками, которые можно установить в качестве обоев будем использовать класс ViewPager. Но не простой, а такой чтобы поддерживался и на старых версиях Android. Для этого нам необходимо подключить библиотеку Support Library. Как ее подключить я написал здесь. Посередине экрана будет листалка с картинками, а внизу будет находится кнопка "Установить обои". Для того, чтобы создать такую разметку будем использовать RelativeLayout.
Разметка файла main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_above="@+id/setWlpBtn" android:layout_marginBottom="10dip"> </android.support.v4.view.ViewPager> <Button android:id="@+id/setWlpBtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/set_wlp_button_title" android:layout_alignParentBottom="true" android:layout_marginBottom="50dp" /> </RelativeLayout>
4. Разметка фрагмента
Для каждой отдельной картинки будет использоваться фрагмент.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/RelativeLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/markxImage" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> </ImageView> </RelativeLayout>
5. Класс MainActivity
Класс MainActivity будет наследоваться от класса FragmentActivity. В переменные класса добавим ViewPager pager для перелистывания картинок и PagerAdapter pagerAdapter отображения листалки. Так же создадим массив с картинками
private int[] images = new int[] {R.drawable.markx01, ... , R.drawable.markx16}
Получим кнопку на view, после чего прикрепим к ней обработчик события нажатия по кнопке, в котором установим обои и покажем всплывающее сообщение о том, что обои успешно установлены. Для установки обоев будем использовать класс WallpaperManager, а для показа всплывающего сообщения - класс Toast.
Получим pager на view, создадим MyFragmentPageAdapter и установим его для pager'а. После чего прикрепим к pager'y обработчик события перелистывания страниц.
Button setWlpBtn = (Button) findViewById(R.id.setWlpBtn); setWlpBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { WallpaperManager wallpaperManager = WallpaperManager .getInstance(getApplicationContext()); try { wallpaperManager.setResource(images[pager.getCurrentItem()]); // success toast Context context = getApplicationContext(); CharSequence text = "Обои успешно установлены!"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } catch (IOException e) { e.printStackTrace(); } } });
Получим pager на view, создадим MyFragmentPageAdapter и установим его для pager'а. После чего прикрепим к pager'y обработчик события перелистывания страниц.
pager = (ViewPager) findViewById(R.id.viewPager); pagerAdapter = new MyFragmentPageAdapter(getSupportFragmentManager()); pager.setAdapter(pagerAdapter); pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
Класс MainActivity.java полностью
package pro.newapp.MarkXWallpapers; import android.app.WallpaperManager; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.Gravity; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.io.IOException; public class MainActivity extends FragmentActivity { ViewPager pager; PagerAdapter pagerAdapter; private int[] images = new int[] {R.drawable.markx01, R.drawable.markx02, R.drawable.markx03, R.drawable.markx04, R.drawable.markx05, R.drawable.markx06, R.drawable.markx07, R.drawable.markx08, R.drawable.markx09, R.drawable.markx10, R.drawable.markx11, R.drawable.markx12, R.drawable.markx13, R.drawable.markx14, R.drawable.markx15, R.drawable.markx16}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button setWlpBtn = (Button) findViewById(R.id.setWlpBtn); setWlpBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { WallpaperManager wallpaperManager = WallpaperManager.getInstance(getApplicationContext()); try { wallpaperManager.setResource(images[pager.getCurrentItem()]); // success toast Context context = getApplicationContext(); CharSequence text = "Обои успешно установлены!"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } catch (IOException e) { e.printStackTrace(); } } }); pager = (ViewPager) findViewById(R.id.viewPager); pagerAdapter = new MyFragmentPageAdapter(getSupportFragmentManager()); pager.setAdapter(pagerAdapter); pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int i, float v, int i2) { } @Override public void onPageSelected(int i) { } @Override public void onPageScrollStateChanged(int i) { } }); } private class MyFragmentPageAdapter extends FragmentPagerAdapter { private int[] images = new int[] {R.drawable.markx01, R.drawable.markx02, R.drawable.markx03, R.drawable.markx04, R.drawable.markx05, R.drawable.markx06, R.drawable.markx07, R.drawable.markx08, R.drawable.markx09, R.drawable.markx10, R.drawable.markx11, R.drawable.markx12, R.drawable.markx13, R.drawable.markx14, R.drawable.markx15, R.drawable.markx16}; private int imagesCount = images.length; public MyFragmentPageAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int i) { return PageFragment.newInstance(images[i]); } @Override public int getCount() { return imagesCount; } } }
6. Класс PageFragment
Класс PageFragment наследуется от класса Fragment. Создадим переменную класса imageId, в которую будет передаваться id картинки. С помощью статического метода newInstance будем получать новый instance класса. В этом методе будем сохранять в аргументы фрагмента номер страницы, который будет передаваться в метод. В методе onCreate будем получать из аргументов фрагмента imageId. В методе onCreateView находим imageView и устанавливаем ей картинку.
package pro.newapp.MarkXWallpapers; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; public class PageFragment extends Fragment { static final String ARGUMENT_IMAGE_ID = "arg_image_id"; int imageId; static Fragment newInstance(int image) { PageFragment pageFragment = new PageFragment(); Bundle arguments = new Bundle(); arguments.putInt(ARGUMENT_IMAGE_ID, image); pageFragment.setArguments(arguments); return pageFragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); imageId = getArguments().getInt(ARGUMENT_IMAGE_ID); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment, null); ImageView imageView = (ImageView) view.findViewById(R.id.markxImage); imageView.setImageResource(imageId); return view; } }
Что в итоге у меня получилось можете посмотреть, скачав мое приложение с обоями из Play Store.
Полезная информация про то, как делать обои для Android
http://www.youtube.com/watch?v=oiCKnevQLWU
http://www.edumobile.org/android/android-beginner-tutorials/setting-an-image-as-a-wallpaper/
http://stackoverflow.com/questions/15738801/how-to-create-live-wallpaper-application-in-android
http://www.vogella.com/articles/AndroidLiveWallpaper/article.html
Комментариев нет:
Отправить комментарий