Android动态壁纸

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值