1.WallpaperService
public class GLWallpaperService extends WallpaperService {
@Override
public Engine onCreateEngine() {
return new GLEngine();
}
}
2.WallpaperService.Engine(GLWallpaperService内部类创建GLEngine)
/**
* 生命周期与Acitivity类似
* onCreate()创建壁纸
* onVisibilityChanged()壁纸显示隐藏切换调用
* onDestroy()销毁壁纸
*/
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();
}
}
3.自定义GLSurfaceView(GLWallpaperService内部类创建WallpaperGLSurfaceView)
/**
* 为WallpaperService.Engine重载getHolder()
* 销毁壁纸时调用onWallpaperDestroy()
*/
class WallpaperGLSurfaceView extends GLSurfaceView {
WallpaperGLSurfaceView(Context context) {
super(context);
}
@Override
public SurfaceHolder getHolder() {
//WallpaperService.Engine.getSurfaceHolder()
return getSurfaceHolder();
}
public void onWallpaperDestroy() {
//GLSurfaceView相关清除工作,与onAttachedToWindow()相对应(负责GLSurfaceView绘制前的相关工作)
super.onDetachedFromWindow();
}
@Override
public void onSurfaceChanged(final SurfaceHolder holder, final int format, final int width, final int height) {
super.onSurfaceChanged(holder, format, width, height);
this.width = width;
}
}
4.添加描述壁纸服务的xml描述符(res/xml/wallpaper.xml)
5.Manifest添加壁纸服务声明
6.添加随主屏幕滑动背景
6.1重写GLEngine中该方法
@Override
public void onOffsetsChanged(final float xOffset, final float yOffset, final float xOffsetStep,final float yOffsetStep, final int xPixelOffset, final int yPixelOffset) {
//重写GLEngine中该方法
}
6.2高版本不支持该方法,解决方法参考
http://andraskindler.com/blog/2015/live-wallpaper-onoffsetchanged-scrolling/
7.限制帧率
/**
* 限制帧率:降低绘制次数从而节约电能
* @param framesPerSecond
*/
private void limitFrameRate(int framesPerSecond) {
long elapsedFrameTimeMs = SystemClock.elapsedRealtime() - frameStartTimeMs;
long expectedFrameTimeMs = 1000 / framesPerSecond;
long timeToSleepMs = expectedFrameTimeMs - elapsedFrameTimeMs;
if (timeToSleepMs > 0) {
SystemClock.sleep(timeToSleepMs);
}
frameStartTimeMs = SystemClock.elapsedRealtime();
}
8.保留EGL上下文
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
//保留EGL上下文:onPause()到onResume()不用重新绘制,存储上帧数据从而节省电能而又不影响用户体验
glSurfaceView.setPreserveEGLContextOnPause(true);
}
9.总结:制作壁纸时在高版本不支持onOffsetsChanged()滑动,采用6.2方法虽然可解决滑动问题,但还是需要设置桌面页数,而我们并不能直接获取。
10.源码:https://github.com/HQlin/OpenGLLiveWallpaper/commits/master