Draw the wallpaper chosen by the user
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user