[라이브 배경화면(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을 그려야합니다.
'안드로이드' 카테고리의 다른 글
안드로이드 - android.os.NetworkOnMainThreadException (1) | 2015.07.19 |
---|---|
안드로이드 - Bitmap(이미지) 사이즈 변경(Scale) 및 회전(Rotation)_하는 방법 (0) | 2015.06.24 |
안드로이드 - 라이브 배경화면(Live Wallpaper) #2 이미지 넣기 (0) | 2015.06.12 |
안드로이드 - 리소스 이미지를 Bitmap 클래스로 변환하기 (0) | 2015.06.12 |
안드로이드 - 라이브 배경화면(Live Wallpaper) #1 기본구조 (0) | 2015.06.12 |
댓글