• 周三. 6 月 24th, 2026

物嫩软件资讯网

软件资讯来物嫩

Android OpenGL动态壁纸

admin@wunen

6 月 6, 2025

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) 选择”设置壁纸”

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注