1. rs/xml/mylivewallpaper.xml

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

2.AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lp.wallpaper">
<uses-sdk android:minSdkVersion="7" />
<uses-feature android:name="android.software.live_wallpaper" />

<application
android:icon="@drawable/icon"
android:label="@string/app_name">

<service
android:label="@string/app_name"
android:name=".MyWallpaper"
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/mylivewallpaper" />
</service>

</application>
</manifest>

3.MyWallpaper.java

package com.lp.wallpaper;

import java.text.SimpleDateFormat;
import java.util.Date;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;

public class MyWallpaper extends WallpaperService{
private Handler handler = new Handler();



@Override
public void onCreate() {
System.out.println("service onCreate");
super.onCreate();
}

@Override
public void onDestroy() {
System.out.println("service onDestory");
super.onDestroy();
}

@Override
public Engine onCreateEngine() {
System.out.println("service onCreateEngine");
return new MyEngine();
}

private class MyEngine extends Engine{

private float x = 200;
private float y = 300;
private Paint mPaint;
private boolean mVisible = false;

private Runnable drawThread = new Runnable() {
public void run() {
drawWallpaper();
}
};

public MyEngine(){
System.out.println("MyEngine");
mPaint = new Paint();
mPaint.setColor(Color.RED);
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(4);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setTextSize(24);
}

@Override
public Bundle onCommand(String action, int x, int y, int z, Bundle extras, boolean resultRequested) {
// TODO Auto-generated method stub
System.out.println("onCommand");
return super.onCommand(action, x, y, z, extras, resultRequested);
}

@Override
public void onCreate(SurfaceHolder surfaceHolder) {
System.out.println("onCreate");
super.onCreate(surfaceHolder);
//作用是使壁纸能响应touch event,默认是false
setTouchEventsEnabled(true);
}

@Override
public void onDestroy() {
System.out.println("onDestroy");
super.onDestroy();
handler.removeCallbacks(drawThread);
}

@Override
public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {
// TODO Auto-generated method stub
System.out.println("onoffsetsChanged");
super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);
}

@Override
public void onVisibilityChanged(boolean visible) {
System.out.println("onVisibilityChanged");
mVisible = visible;
if (visible) {
//开始
handler.postDelayed(drawThread, 50);
} else {
handler.removeCallbacks(drawThread);
}
}

@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
System.out.println("onSurfaceChanged");
// TODO Auto-generated method stub
super.onSurfaceChanged(holder, format, width, height);
}

@Override
public void onSurfaceCreated(SurfaceHolder holder) {
System.out.println("onSurfaceCreated");
super.onSurfaceCreated(holder);
}

@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
System.out.println("onSurfaceDestoryed");
// TODO Auto-generated method stub
super.onSurfaceDestroyed(holder);
handler.removeCallbacks(drawThread);
}

@Override
public void onTouchEvent(MotionEvent event) {
System.out.println("onTouchEvent");
// TODO Auto-generated method stub
super.onTouchEvent(event);
}


private void drawWallpaper() {

SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = holder.lockCanvas();
drawTime(canvas);
holder.unlockCanvasAndPost(canvas);

//循环执行
handler.postDelayed(drawThread, 50);
}

private void drawTime(Canvas canvas) {
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String dataStr = sdf.format(date);
canvas.save();
canvas.drawColor(0xff00ff00);
canvas.drawText(dataStr, x, y, mPaint);
canvas.restore();
}
}

}

更多相关文章

  1. Android消息循环实现原理分析
  2. Android真响应式架构——Model层设计
  3. Android真响应式架构——数据流动性
  4. Android(安卓)用网络图片做帧动画
  5. Android菜单详解——理解android中的Menu
  6. Android(安卓)可显示左上右下Drawable的TextView
  7. Android异步处理三:Handler+Looper+MessageQueue深入详解 .
  8. ViewFlipper+GestureDetector实现不循环滑动
  9. Android真响应式架构——Epoxy的使用

随机推荐

  1. Android(安卓)播放网络视频,视频流的处理
  2. Android学习笔记(36):Android的两种事件
  3. 云时代下,设备的移动性到底对企业有什么影
  4. 【Android】Android(安卓)手机杀进程并不
  5. Android粘性菊花—-粘性LoadingView你所
  6. mars Android视频第14讲中代码出现的错误
  7. Android(安卓)错误:at java.lang.reflect.
  8. 为什么说模仿是最好的学习方法?
  9. Android(安卓)webview新漏洞,可导致同WiFi
  10. 基线(Baseline)的含义以及在Android中的使