Draw the wallpaper chosen by the user

This commit is contained in:
Romain Guy
2009-08-11 19:12:17 -07:00
parent 50cb54ff5c
commit ef654bdd5b

View File

@@ -18,73 +18,68 @@ package com.android.internal.service.wallpaper;
import android.app.WallpaperManager;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.service.wallpaper.WallpaperService;
import android.view.SurfaceHolder;
import android.content.Context;
import android.content.IntentFilter;
import android.content.Intent;
import android.content.BroadcastReceiver;
/**
* Default built-in wallpaper that simply shows a static image.
*/
public class ImageWallpaper extends WallpaperService {
public WallpaperManager mWallpaperManager;
static final int MSG_DRAW = 1;
class MyEngine extends Engine {
final Paint mTextPaint = new Paint();
float mDensity;
Drawable mBackground;
long mAnimStartTime;
boolean mAnimLarger;
final Handler mHandler = new Handler() {
WallpaperManager mWallpaperManager;
ImageWallpaper.DrawableEngine mEngine;
private WallpaperObserver mReceiver;
@Override
public void onCreate() {
super.onCreate();
mWallpaperManager = (WallpaperManager) getSystemService(WALLPAPER_SERVICE);
IntentFilter filter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED);
mReceiver = new WallpaperObserver();
registerReceiver(mReceiver, filter);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
public Engine onCreateEngine() {
mEngine = new DrawableEngine();
return mEngine;
}
class WallpaperObserver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
mEngine.updateWallpaper();
}
}
class DrawableEngine extends Engine {
private final Object mLock = new Object();
Drawable mBackground;
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_DRAW:
drawFrame(true);
mHandler.sendEmptyMessage(MSG_DRAW);
break;
default:
super.handleMessage(msg);
}
}
};
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
mBackground = mWallpaperManager.getDrawable();
mTextPaint.setAntiAlias(true);
mDensity = getResources().getDisplayMetrics().density;
mTextPaint.setTextSize(30 * mDensity);
mTextPaint.setShadowLayer(5*mDensity, 3*mDensity, 3*mDensity, 0xff000000);
mTextPaint.setARGB(255, 255, 255, 255);
mTextPaint.setTextAlign(Paint.Align.CENTER);
}
@Override
public void onVisibilityChanged(boolean visible) {
mHandler.removeMessages(MSG_DRAW);
if (visible) {
mHandler.sendEmptyMessage(MSG_DRAW);
mAnimStartTime = SystemClock.uptimeMillis();
mAnimLarger = true;
} else {
drawFrame(false);
}
drawFrame();
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
super.onSurfaceChanged(holder, format, width, height);
drawFrame(false);
drawFrame();
}
@Override
@@ -97,48 +92,28 @@ public class ImageWallpaper extends WallpaperService {
super.onSurfaceDestroyed(holder);
}
void drawFrame(boolean drawText) {
void drawFrame() {
SurfaceHolder sh = getSurfaceHolder();
Canvas c = null;
try {
c = sh.lockCanvas();
if (c != null) {
final Rect frame = sh.getSurfaceFrame();
mBackground.setBounds(frame);
mBackground.draw(c);
if (drawText) {
// Figure out animation.
long now = SystemClock.uptimeMillis();
while (mAnimStartTime < (now-1000)) {
mAnimStartTime += 1000;
mAnimLarger = !mAnimLarger;
}
float size = (now-mAnimStartTime) / (float)1000;
if (!mAnimLarger) size = 1-size;
int alpha = (int)(255*(size*size));
mTextPaint.setARGB(alpha, 255, 255, 255);
mTextPaint.setShadowLayer(5*mDensity, 3*mDensity, 3*mDensity,
alpha<<24);
mTextPaint.setTextSize(100 * mDensity * size);
c.drawText("Am I live?",
frame.left + (frame.right-frame.left)/2,
frame.top + (frame.bottom-frame.top)/2, mTextPaint);
synchronized (mLock) {
final Drawable background = mBackground;
background.setBounds(frame);
background.draw(c);
}
}
} finally {
if (c != null) sh.unlockCanvasAndPost(c);
}
}
}
@Override
public void onCreate() {
super.onCreate();
mWallpaperManager = (WallpaperManager)getSystemService(WALLPAPER_SERVICE);
}
public Engine onCreateEngine() {
return new MyEngine();
void updateWallpaper() {
synchronized (mLock) {
mBackground = mWallpaperManager.getDrawable();
}
}
}
}