|
package pe.berabue.livewallpaper; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.os.Handler; import android.service.wallpaper.WallpaperService; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; public class WallPaPer_Canvas extends WallpaperService { private final Handler mHandler = new Handler(); @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } @Override public Engine onCreateEngine() { return new CanvasEngine(); } private class CanvasEngine extends Engine { private Bitmap imgIcon; private final Runnable mRunnable = new Runnable() { public void run() { drawFrame(); } }; private boolean isVisible; public CanvasEngine() { imgIcon = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.icon); } @Override public void onCreate(SurfaceHolder surfaceHolder) { super.onCreate(surfaceHolder); setTouchEventsEnabled(true); } @Override public void onDestroy() { super.onDestroy(); mHandler.removeCallbacks(mRunnable); } @Override public void onVisibilityChanged(boolean visible) { isVisible = visible; if (visible) { drawFrame(); } else { mHandler.removeCallbacks(mRunnable); } } @Override public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); } @Override public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { super.onSurfaceChanged(holder, format, width, height); Log.v(null," :::: onSurfaceChanged : "+format+" / "+width+", "+height); drawFrame(); } @Override public void onSurfaceDestroyed(SurfaceHolder holder) { super.onSurfaceDestroyed(holder); isVisible = false; mHandler.removeCallbacks(mRunnable); } @Override public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) { Log.v(null," :::: onOffsetsChanged : "+xOffset+", "+yOffset+", "+xStep+", "+yStep+", "+xPixels+", "+yPixels); drawFrame(); } @Override public void onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { Log.v(null," :::: onTouchEvent"); } super.onTouchEvent(event); } public void drawFrame() { final SurfaceHolder holder = getSurfaceHolder(); Canvas canvas = null; try { canvas = holder.lockCanvas(); if (canvas != null) { canvas.drawBitmap(imgIcon, 0, 0, null); } } finally { if (canvas != null) holder.unlockCanvasAndPost(canvas); } mHandler.removeCallbacks(mRunnable); if (isVisible) { mHandler.postDelayed(mRunnable, 1000 / 25); } } } }
mHandler를 등록하고 이미지를 준비시킨다.
onVisibilityChanged(); 화면이 보여지고 있는지 가려졌는지를 알아내 isVisible에 넣는다. 화면이 보여지고 있다면 drawFrame();으로 들어간다. drawFrame(); 실직적으로 이미지가 그려지는 곳. 이미지 처리를 완료하고 핸들러를 제거한다. 화면이 계속 보여지는 중이라면 원하는 딜레이로 핸들러를 다시 등록하여준다.
화면이 가려지거나(다른어플 실행, 화면꺼짐 등) 해당 Live Wallpaper를 종료시킬때 핸들러를 제거하여준다.
아래 화면과 같이 타이틀바 영역을 포함하여 좌표가 시작된다.
아래 화면과 같이 타이틀바 영역을 포함하여 좌표가 시작된다.
|
'Android > Live WallPaper' 카테고리의 다른 글
[ Live WallPaper - 03 ] 설정 화면 만들기 (0) | 2011.07.15 |
---|---|
[ Live Wallpaper - 01 ] 기본 구조 (0) | 2011.06.10 |