Поиск по этому блогу

суббота, 8 февраля 2014 г.

Android. Как сделать приложение с обоями



Для создания приложения с обоями нам понадобятся прежде всего картинки. Заранее подготовленные картинки назовем и поместим в папки. В каждую папку будут помещены картинки для экранов с разным разрешением - от маленьких до самых больших.




2. AndroidManifest.xml


Добавляем в файл 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. Разметка фрагмента


Для каждой отдельной картинки будет использоваться фрагмент.

Разметка файла fragment.xml
<?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.
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 и устанавливаем ей картинку.

Класс PageFragment.java полностью
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. 


Get it on Google Play



Полезная информация про то, как делать обои для Android

http://stackoverflow.com/questions/12346023/creating-simple-wallpaper-application-in-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