android 动态壁纸 2

简介: 1. rs/xml/mylivewallpaper.xml   2.AndroidManifest.xml     3.MyWallpaper.java   package com.

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();
}
}

}

相关文章
|
5天前
|
安全 Android开发 数据安全/隐私保护
Android中的动态权限请求与最佳实践
【4月更文挑战第14天】 在现代安卓应用开发中,用户隐私和安全被赋予了前所未有的重要性。随着Android 6.0(API级别23)引入的运行时权限模型,开发者必须更加细致地处理权限请求,以确保应用功能的完整性同时不侵犯用户的隐私。本文将深入探讨如何在Android应用中实现动态权限请求,分析常见问题,并提供一系列最佳实践,以帮助开发者优雅地处理这一挑战。
16 5
|
4月前
|
XML Java Android开发
Android App开发之图像加工中给图像添加水波动态特效(附源码和演示视频 简单易懂)
Android App开发之图像加工中给图像添加水波动态特效(附源码和演示视频 简单易懂)
40 0
|
9月前
|
Android开发 iOS开发 Windows
无影产品动态|iOS & Android客户端6.0.0版本发布,提升触控灵敏度,操作体验更丝滑
无影ios & Android客户端6.0.0版本发布!移动端触控体验更舒适,用户操作更便捷,一起来看看!
676 0
无影产品动态|iOS & Android客户端6.0.0版本发布,提升触控灵敏度,操作体验更丝滑
|
9月前
|
双11 Android开发
Android动态来改变App桌面图标
其实对于这样的一个桌面图标更换,Android中为我们提供了AndroidManifest.xml里的<activity-alias>标签实现方式。
221 0
|
10月前
|
安全 Android开发
Android 动态权限 permission 操作类简单封装
Android 动态权限 permission 操作类简单封装
|
11月前
|
XML 编解码 Android开发
Android 设置Padding和Margin(动态/静态)
在Android界面开发时,为了布局更加合理好看,很多时候会用上Padding和Margin, padding和margin是什么呢?即内边距和外边距; 某个View指定为padding是针对该View里面的子View距离该View距离而言的,或者是里面的内容距离容器的距离。
|
API Android开发
组件化系列(一)Android动态权限
历史版本权限组件使用的是AndPermission,长期无人维护,历史代码臃肿,不便拓展,考虑使用PermissionsDispatcher,但是PermissionsDispatcher APT插件会影响编译效率,easypermissions侵入性太强,会影响整个工程,RxPermissions 貌似是最佳选择,但是RxPermissions需要高度自定义符合自己项目特色的UI,所以干脆自己写个权限组件好了,希望大家喜欢
69 0
|
存储 开发工具 Android开发
Android中动态获取最新的git commit_id
项目中有时会遇到需要我们获取最新版本号的逻辑,方便我们定位错误等。
|
Android开发
Android动态权限(兼容6.0以下和魅族手机方案)
这里以照相机权限为例说明问题。实际开发过程中遇到了不少的坑。