본문 바로가기
안드로이드

안드로이드 - 라이브 배경화면(Live Wallpaper) #3 설정화면 만들기

by Dokon Jang 2015. 6. 22.
반응형

[라이브 배경화면(Live Wallpaper) 개발 포스팅]

 - 라이브 배경화면(Live Wallpaper) #1 기본구조 : http://docko.tistory.com/132
 - 라이브 배경화면(Live Wallpaper) #2 이미지 넣기 : http://docko.tistory.com/134
 - 라이브 배경화면(Live Wallpaper) #3 설정화면 만들기 : http://docko.tistory.com/143

※ 아래의 내용은 위의 라이브 배경화면 포스팅을 참고하시길 바랍니다.

 

안드로이드 라이브 배경화면의 설정화면을 제작해보도록 하겠습니다.

작업 순서는 아래와 같습니다.

[1] 설정화면(Preference) XML 생성

[2] 설정화면(Preference) Activity 생성

[3] 배경화면 XML에 설정화면 연결

[4] AndroidManifest.xml 작성

[5] 배경화면 설정 화면 실행

[6] 배경화면에 설정값 적용

 

1. 설정화면(Preperence) XML 생성

(1) 리소스의 xml폴더에서 마우스 오른쪽을 클릭 후 팝업 메뉴에서 New > XML resource file을 클릭합니다.

 

(2) New XML Resource File화면에서 File Name을 입력 후 OK버튼을 클릭합니다.

    (Root element는 기본적으로 PreferenceScreen이 되어있습니다.)

 

(3) 생성된 Preperence XML을 아래와 같이 CheckBoxPreference를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference android:key="SCALE_2X"
        android:title="이미지 크기 2배로"
        android:defaultValue="false" />
</PreferenceScreen>
 

 

2. 설정화면(Preference) Activity 생성

(1) 설정화면 Activity를 생성 할 Package를 선택 후 마우스 오른쪽을 클릭하여, 팝업메뉴에서 New > Java Class를 클릭합니다.

 

(2) Create New Class 화면에서 Name을 입력 수 Ok 버튼을 클릭합니다.

 

(3) 생성된 Java 소스를 아래와 같이 수정합니다.

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class WallpaperPreperence extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.mywallpaper_preperence);
    }
}
 

 

※ 아래와 같이 New > Activity > Settings Activity를 이용하여 설정화면을 생성 할 수 있으나, 불필요한 파일 및 소스가 생성되므로 위의 Java 소스와 같이 작업했습니다.

 

3. 배경화면 XML에 설정화면 연결

 - 배경화면 xml에 android:settingsActivity 속성에 배경화면 설정 Activity를 연결합니다.

<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
    android:thumbnail="@drawable/ic_launcher"
    android:settingsActivity="com.jmsys.mywallpaper.WallpaperPreperence">
</wallpaper>
 

 

4. AndroidManifest.xml 작성

 - 아래와 같이 WallpaperPreperence Activity를 등록합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jmsys.mywallpaper" >

    <uses-feature android:name="android.software.live_wallpaper" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <!-- Wallpaper -->
        <service
            android:name=".MyWallpaper"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_WALLPAPER" >
            <intent-filter>
                <action android:name="android.service.wallpaper.WallpaperService" />
            </intent-filter>

            <meta-data
                android:name="android.service.wallpaper"
                android:resource="@xml/mywallpaper" />
        </service>
        
        <activity
            android:name=".WallpaperPreperence"
            android:label="설정" >
        </activity>
    </application>

</manifest>

 

5.배경화면 설정 화면 실행

(1) 배경화면 지정 화면을 실행 후 설정을 클릭합니다.

 

(2) 설정화면이 표시되지 않고, 아래와 같은 오류가 발생합니다.

 

(3) 위의 오류는 MyWallpaper 앱의 Activity를 다른 앱(배경화면 지정 앱)이 실행하려고 하기 때문에 발생합니다.

   이러한 경우 AndroidManifest.xml에서 배경화면 설정화면 Activity 의 android:exported 속성 값을 "true"로 지정해야 합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jmsys.mywallpaper" >

    <uses-feature android:name="android.software.live_wallpaper" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <!-- Wallpaper -->
        <service
            android:name=".MyWallpaper"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_WALLPAPER" >
            <intent-filter>
                <action android:name="android.service.wallpaper.WallpaperService" />
            </intent-filter>

            <meta-data
                android:name="android.service.wallpaper"
                android:resource="@xml/mywallpaper" />
        </service>
        
        <activity
            android:name=".WallpaperPreperence"
            android:exported="true"
            android:label="설정" >
        </activity>
    </application>

</manifest>
 

 

(4) 다시 실행하여 설정 화면으로 이동하면 아래와 같이 정상적으로 표시됩니다.

 

6. 배경화면에 설정값 적용

(1) 아래와 같이 소스를 수정하시면 배경 설정 화면에 설정에 따라 이미지 스케일이 변경됩니다.

import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.preference.PreferenceManager;
import android.service.wallpaper.WallpaperService;
import android.view.SurfaceHolder;

public class MyWallpaper extends WallpaperService{
    @Override
    public Engine onCreateEngine() {
        return new MyWallpaperEngine();
    }

    private class MyWallpaperEngine extends Engine{
        @Override
        public void onVisibilityChanged(boolean visible) {
            super.onVisibilityChanged(visible);

            SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(MyWallpaper.this);
            boolean isScale2X = pref.getBoolean("SCALE_2X", false);

            SurfaceHolder holder = getSurfaceHolder();
            Canvas canvas = holder.lockCanvas();
            Bitmap bitmap = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.ic_launcher);

            // 이미지 사이즈 2배로 크게 만들기
            if (isScale2X){
                bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth() * 2, bitmap.getHeight() *2, false);
            }


            canvas.drawBitmap(bitmap, 0, 0, null);

            holder.unlockCanvasAndPost(canvas);
        }
    }
}
 

 

(2) 아래는 배경 설정 적용 후 실행한 화면입니다.

- 아래의 이미지에서와 같이 이전의 이미지가 겹쳐서 나오는데 이 경우는 Canvas객체에서 이전에 그린 Bitmap을 지우고 다시 Bitmap을 그려야합니다.

 

 

반응형

댓글0