openGL ES进阶教程(三)用openGL实现动态壁纸,就是这么简单

原创 2017年05月24日 20:18:57

网上动态壁纸的实现教程有很多,但是用openGL实现动态壁纸的教程却是寥寥无几,那么今天就带领大家学习用openGL实现动态壁纸,起一个抛砖引玉吧。

在之前曾写过一篇 ffmpeg/camera实现最近很火的视频壁纸,相机壁纸 ,动态壁纸的实现套路已经写了,今天就不追述了。

老规矩,先看效果图让大家有个概念:

这里写图片描述

大家也看出来了,没错,是基于上篇openGL ES进阶教程(二)之全景图片 实现的。

下面就具体说说实现套路,真的是套路,你看~

1.首先要实现一个openGL动态图,什么样的图完全由自己的需求决定,比如我的就是基于我上篇的图

2.编写一个继承自WallpaperService的动态壁纸类

public class GLWallpaperService extends WallpaperService {
    @Override
    public Engine onCreateEngine() {
        return new GLEngine();
    }
    ...

3.清单文件中声明它,在定义一个图标的xml,如下:

这里写图片描述

xml的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"    
    android:thumbnail="@drawable/back" />

以上几个步骤即创建了一个动态壁纸,只不过没有渲染图像而已。。。
当WallpaperService被系统创建时,它会创建它自己的渲染表面(Surface),让应用程序在上面绘制,即通过调用Engine这个渲染引擎。下面一个步骤即最重要的一环,如何用openGL渲染的图像在WallpaperService中显现出来

4.完成壁纸的引擎

正常情况下,GLSurfaceView是被加入到Activity视图层的,
GLSurfaceView会调用getHolder()存取其Activity内的表面。在动态壁纸中我们需要改变这个行为,因此我们只需重载getHolder(),让其返回动态壁纸的渲染表面即可。

 class WallpaperGLSurfaceView extends GLSurfaceView {
            private static final String TAG = "WallpaperGLSurfaceView";
            WallpaperGLSurfaceView(Context context) {
                super(context);
            }            
            @Override
            public SurfaceHolder getHolder() {

                return getSurfaceHolder();
            }

            public void onWallpaperDestroy() {

                super.onDetachedFromWindow();
            }
        }

onWallpaperDestroy()方法销毁GLSurfaceView 。当调用onDetachedFromWindow()时,GLSurfaceView 就会自动的销毁自己。

GLWallpaperService 的全部实现代码如下:

import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ConfigurationInfo;
import android.opengl.GLSurfaceView;
import android.os.Build;
import android.service.wallpaper.WallpaperService;
import android.util.Log;
import android.view.SurfaceHolder;
import android.widget.Toast;

public class GLWallpaperService extends WallpaperService {
    @Override
    public Engine onCreateEngine() {
        return new GLEngine();
    }
    public class GLEngine extends Engine {
        private static final String TAG = "GLEngine";

        private WallpaperGLSurfaceView glSurfaceView;
        private ParticlesRenderer particlesRenderer;
        private boolean rendererSet;


        @Override
        public void onCreate(SurfaceHolder surfaceHolder) {
            super.onCreate(surfaceHolder);            

            glSurfaceView = new WallpaperGLSurfaceView(GLWallpaperService.this);

            particlesRenderer = new ParticlesRenderer(GLWallpaperService.this);

                glSurfaceView.setEGLContextClientVersion(2);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                    glSurfaceView.setPreserveEGLContextOnPause(true);
                }
                glSurfaceView.setRenderer(particlesRenderer);
                rendererSet = true;

        }

        @Override
        public void onVisibilityChanged(boolean visible) {
            super.onVisibilityChanged(visible);

            if (rendererSet) {
                if (visible) {
                    glSurfaceView.onResume();
                } else {                   
                    glSurfaceView.onPause();
                }
            }
        }   

        @Override
        public void onDestroy() {
            super.onDestroy();

            glSurfaceView.onWallpaperDestroy();
        }


        class WallpaperGLSurfaceView extends GLSurfaceView {
            private static final String TAG = "WallpaperGLSurfaceView";

            WallpaperGLSurfaceView(Context context) {
                super(context);    
            }            

            @Override
            public SurfaceHolder getHolder() {

                return getSurfaceHolder();
            }

            public void onWallpaperDestroy() {

                super.onDetachedFromWindow();
            }
        }
    }
}

详细各位客官已经看的很明白了……

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android OpenGL动态壁纸

Android OpenGL动态壁纸 1、动态壁纸的Service组件 WallpaperService提供了基本的动态壁纸的实现。 public class GLWallpaperService e...
  • chennai1101
  • chennai1101
  • 2017年08月14日 15:37
  • 279

openGL ES进阶教程(二)之全景图片

全景又被称为3D实景,是一种新兴的富媒体技术,其与视频,声音,图片等传统的流媒体最大的区别是“可操作,可交互”。 全景分为虚拟现实和3D实景两种。虚拟现实是利用maya等软件,制作出来的模拟现实的场景...
  • King1425
  • King1425
  • 2017年05月17日 20:13
  • 1348

openGL ES进阶教程(四)用openGL ES+MediaPlayer 渲染播放视频+滤镜效果

之前曾经写过用SurfaceView,TextureView+MediaPlayer 播放视频,和 ffmpeg avi解码后SurfaceView播放视频 ,今天再给大家来一篇openGL ES+...
  • King1425
  • King1425
  • 2017年05月27日 09:50
  • 2246

openGL ES进阶教程(一)之粒子光束

2016AR/VR喊的火热,这些在Android上的实现或多或少与openGL 有关。 OpenGL能做的事情太多了!很多程序也看起来异常复杂。更有可能因为某一步的顺序错误导致最后渲染出错,这是因为,...
  • King1425
  • King1425
  • 2017年05月17日 09:12
  • 1346

openGL ES进阶教程(五)制作一个简单的VR播放器,播放全景视频

之前写过全景(VR)图片,和用openGL ES+MediaPlayer 渲染播放视频+滤镜效果这一篇就在之前的基础上实现一个最简单的VR播放器,播放全景视频。概述:全景视频是一种用3D摄像机进行全方...
  • King1425
  • King1425
  • 2017年08月01日 20:44
  • 1470

openGL ES进阶教程(六)美颜滤镜之美白,磨皮,红润

网上搜罗了一堆的美颜滤镜效果,可惜尽不如人意。最后偶然看到ios上提供了一个用OC写的美颜滤镜,好吧,改写成Java的试试。好在大学时期搞过一段时间IOS开发,用自己的半吊子的水平,没想到还真改成功了...
  • King1425
  • King1425
  • 2017年09月01日 20:17
  • 1809

OpenGL实现颜色混合

在Opengl中,我们两个物体如果叠在一起,想看到他们混合后的颜色就可以利用ta...
  • ganpengjin1
  • ganpengjin1
  • 2014年06月09日 14:31
  • 1878

OPENGL实现彩虹效果源代码

  • 2012年12月26日 16:22
  • 25KB
  • 下载

FFmpeg,opengl,gpuimage,完成音视频同步加GpuImage的滤镜功能

  • 2015年09月21日 16:37
  • 46.67MB
  • 下载

最简单的基于FFmpeg的AVfilter例子(水印叠加)

FFMPEG中有一个类库:libavfilter。该类库提供了各种视音频过滤器。之前一直没有怎么使用过这个类库,最近看了一下它的使用说明,发现还是很强大的,有很多现成的filter供使用,完成视频的处...
  • leixiaohua1020
  • leixiaohua1020
  • 2014年06月09日 00:03
  • 78133
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:openGL ES进阶教程(三)用openGL实现动态壁纸,就是这么简单
举报原因:
原因补充:

(最多只允许输入30个字)