Android自定义动态壁纸开发

news/2025/1/12 6:11:28/

看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现。

一、动态壁纸原理

如果你了解使用过SurfaceView的话,那么开发一款动态壁纸对你来说其实非常简单。

动态壁纸的本质其实就是一个服务在维护一个动态壁纸引擎Engine,所以我们看到的动态效果其实是通过这个引擎画出来的。而维护这个引擎的服务,就是WallpaperService。本篇文章并不讨论内部实现原理,只是让大家知道如何去实现动态壁纸,所以就不详细说了。

 

二、实现动态壁纸

大体上可分为三个步骤:

  1. 创建自定义WallpaperService继承WallpaperService
  2. 在Manifest中注册该Service并添加相关属性
  3. 创建所需要的xml文件

1.创建自定义WallpaperService

public class MyLwp extends WallpaperService {@Overridepublic Engine onCreateEngine() {return new MyEngine();}class MyEngine extends  Engine{@Overridepublic SurfaceHolder getSurfaceHolder() {return super.getSurfaceHolder();}@Overridepublic void onCreate(SurfaceHolder surfaceHolder) {super.onCreate(surfaceHolder);}@Overridepublic void onDestroy() {super.onDestroy();}@Overridepublic void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {super.onSurfaceChanged(holder, format, width, height);}@Overridepublic void onSurfaceCreated(SurfaceHolder holder) {super.onSurfaceCreated(holder);}@Overridepublic void onSurfaceDestroyed(SurfaceHolder holder) {super.onSurfaceDestroyed(holder);}}
}

2.Manifest注册

        <serviceandroid:name=".MyLwp"android:enabled="true"android:permission="android.permission.BIND_WALLPAPER"><intent-filter><action android:name="android.service.wallpaper.WallpaperService" /></intent-filter><meta-dataandroid:name="android.service.wallpaper"android:resource="@xml/livewallpapervideo" /></service>

一定要添加的几个地方:permission、intent-filter、meta-data。

3.创建需要的xml文件

这个xml文件就是Manifest中meta-data中的resource需要的文件:

<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"android:description="@string/app_name"android:settingsActivity="ASD"android:thumbnail="@mipmap/ic_launcher"/>

需要注意第二个属性:settingsActivity,这个属性可以设置也可以不设置,他是启动一个设置动态壁纸的界面,一般情况下其实用不到这个界面,我们一般会使用PreferenceActivity去实现。下面是添加该属性和不添加该属性的区别:

完成这些之后,就是我们设计动态壁纸的时候了。回到自定义的Wallpaper类中:

我们当时在类中自定义了一个内部类MyEngine继承自Engine。这个Engine就是用来绘制的。关于Engine的几个主要方法如下:

    class MyEngine extends  Engine{//获取SurfaceHolder时调用@Overridepublic SurfaceHolder getSurfaceHolder() {return super.getSurfaceHolder();}//手势移动时回调@Overridepublic void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);}//Surface创建时回调@Overridepublic void onSurfaceCreated(SurfaceHolder holder) {super.onSurfaceCreated(holder);}//Surface销毁时回调@Overridepublic void onSurfaceDestroyed(SurfaceHolder holder) {super.onSurfaceDestroyed(holder);}}

onOffsetsChanged要注意一下,还记得有的手机滑动桌面时候背景图片会跟着左右移动吗,这个方法就可以实现这个效果,在手势滑动的每一帧都会回调依次。一下是个人理解的参数的含义:

xOffset:x方向滑动的百分比(与桌面分页数有关)

yOffset:y方向滑动百分比(一般用不到)

xOffsetStep:x方向每个分页所占的百分比(1 / xOffsetStep = 桌面的分页数)

yOffsetStep:同

xPixelOffset:x放下像素偏移量

y。。。。。

 

4.绘制。

实现绘制的方式,就跟SurfaceView的绘制一样了:

        @Overridepublic void onSurfaceCreated(SurfaceHolder holder) {super.onSurfaceCreated(holder);Canvas canvas = holder.lockCanvas();canvas.drawColor(Color.RED);holder.unlockCanvasAndPost(canvas);}

我只是简单的话了一个红色背景,效果如下:

当然可以实现很多不同的效果,这个就根据不同的需求去实现了。


http://www.ppmy.cn/news/120963.html

相关文章

Android 壁纸应用之动态壁纸

效果图&#xff0c;图中桌面背景为一段视频 对动态壁纸进行一些设置 在res下创建一个xml文件夹&#xff0c;在创建一个wallpager标签文件 <?xml version"1.0" encoding"utf-8"?> <wallpaper xmlns:android"http://schemas.android.co…

Android动态桌面,设置壁纸篇

最近要做一个动态桌面。就看了下动态桌面有关的东西。 1&#xff0c;通过WallpaperManager设置静态壁纸 1.1先通过以下方法获取到WallpaperManager 1.2这个WallpaperManager里面有多种方式设置静态壁纸&#xff0c;需要android.Manifest.permission.SET_WALLPAPER这个权限不…

Android_动态壁纸介绍

Android的动态壁纸主要用到三个类&#xff1a; android.app.WallpaperManager&#xff1a;这个类主要用于获取系统壁纸的信息。再写动态壁纸的时候用不到。 android.service.wallpaper.WallpaperService&#xff1a;这个类作为服务在运行&#xff0c;同时负责产生一个Engine。 …

推荐5款动态壁纸软件(Win+Android)

前言 随着硬件的迭代升级&#xff0c;在大多日常使用中&#xff0c;电脑性能都处于过剩状态 所以从前有些鸡肋且会让电脑运行变卡顿的动态壁纸&#xff0c;也成为了很多朋友让桌面更加生动美观的选择 不过即便使用动态壁纸的用户越来越多&#xff0c;Windows及大多手机系统仍…

JavaScript高级教程(javascript实战进阶)

javascript高级、面试常问、必备知识点 1.数据类型2.引用变量赋值问题3. 对象和函数4.函数原型与原型链面试题一面试题二面试题一分析面试题二分析原型链注意点 5.执行上下文和执行上下文栈面试题一面试题二面试题一分析面试题二分析 6.作用域面试题一面试题二面试题一分析面试…

Android 10.0WallpaperPicker2添加动态壁纸服务

1.概述 在10.0的系统产品开发中,在定制化开发中,由于需要动态壁纸,而系统自带的只有默认的静态壁纸, 所以需要添加动态壁纸的功能 2.WallpaperPicker2添加动态壁纸服务的核心类 packages\apps\WallpaperPicker2\src\com\android\wallpaper\widget\GIFWallpaperService.j…

关键字 package、import的使用

一、package 关键字的使用 为了更好的实现项目中类型的管理&#xff0c;提供了包的概念使用package声明类或接口所属的包&#xff0c;声明在源文件的首行包 术语标识符&#xff0c;遵循标识符的命名规则、规范&#xff08;xxxyyyzzz&#xff09;、“见名知意”每 “ . ”一次&…

GB28181——实时视频显示

一、主要实现功能 1、支持四路设备接入 2、实时视频分屏显示 3、接入设备信息存储 二、待完善功能&#xff08;现阶段&#xff09; 1、设备的删除 &#xff08;已更新&#xff09; 2、语音对讲 &#xff08;暂时不处理&#xff09; 3、视频输出通道的实时修改 &#xff08;已更…