Android OpenGL动态壁纸
首先申明下,本文为笔者学习《OpenGL ES应用开发实践指南》的笔记,并加入笔者自己的理解和归纳总结。
1、动态壁纸的Service组件
WallpaperService提供了基本的动态壁纸的实现。
public class GLWallpaperService extends WallpaperService {
@Override
public Engine onCreateEngine() {
return new GLEngine();
}
}
2、创建自定义GLSurfaceView
GLSurfaceView会调用getHolder()来添加界面,只需重载getHolder方法,返回动态壁纸的渲染表面。onWallpaperDestroy在销毁动态壁纸时被调用,使用GLSurfaceView的onDetachedFromWindow方法。
class WallpaperGLSurfaceView extends GLSurfaceView {
public WallpaperGLSurfaceView(Context context) {
super(context);
}
@Override
public SurfaceHolder getHolder() {
return GLEngine.this.getSurfaceHolder();
}
public void onWallpaperDestroy() {
super.onDetachedFromWindow();
}
}
3、Engine类
GLEngine继承Engine类,当动态壁纸创建时,调用GLEngine的onCreate方法来初始化,销毁时调用onDestroy方法。当动态壁纸可见或者隐藏时,onVisibilityChanged方法会被调用。
public class GLEngine extends Engine {
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
}
@Override
public void onVisibilityChanged(boolean visible) {
super.onVisibilityChanged(visible);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
完善动态壁纸的生命周期,在onCreate中创建GLSurfaceView,onDestroy中销毁。
private WallpaperGLSurfaceView mSurfaceView;
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
mSurfaceView = new WallpaperGLSurfaceView(GLWallpaperService.this);
}
public void onVisibilityChanged(boolean visible) {
super.onVisibilityChanged(visible);
if (mRender) {
if (visible) {
mSurfaceView.onResume();
} else {
mSurfaceView.onPause();
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
mSurfaceView.onWallpaperDestroy();
}
4、添加配置
在AndroidManifest.xml中添加
<uses-feature android:name="android.software.live_wallpaper" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
表明这个应用包含一个动态壁纸,并且还需要OpenGL ES 2.0或以上版本。
还需要添加动态壁纸Service的引用
<service android:name=".opengl.GLWallpaperService"
android:label="@string/app_name"
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/wallpaper" />
</service>
在资源目录res/xml下,添加wapaper.xml文件
<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
android:thumbnail="@drawable/ic_wallpaper" />
5、体验动态壁纸
(1) 切换到设备的主屏幕上,按住屏幕的空白部分,直至弹出一个菜单。
(2) 选择”动态壁纸”,从弹出的列表中选择我们自己的动态壁纸。
(3) 选择”设置壁纸”
