用openGL實現(xiàn)動態(tài)壁紙黄琼,就是這么簡單

網(wǎng)上動態(tài)壁紙的實現(xiàn)教程有很多苗缩,但是用openGL實現(xiàn)動態(tài)壁紙的教程卻是寥寥無幾饵蒂,那么今天就帶領大家學習用openGL實現(xiàn)動態(tài)壁紙,起一個拋磚引玉吧酱讶。

在之前曾寫過一篇 ffmpeg/camera實現(xiàn)最近很火的視頻壁紙退盯,相機壁紙 ,動態(tài)壁紙的實現(xiàn)套路已經(jīng)寫了泻肯,今天就不追述了渊迁。

老規(guī)矩,先看效果圖讓大家有個概念:

這里寫圖片描述

大家也看出來了灶挟,沒錯宫纬,是基于上篇openGL ES進階教程(二)之全景圖片 實現(xiàn)的。

下面就具體說說實現(xiàn)套路膏萧,真的是套路,你看~
1.首先要實現(xiàn)一個openGL動態(tài)圖,什么樣的圖完全由自己的需求決定榛泛,比如我的就是基于我上篇的圖

2.編寫一個繼承自WallpaperService的動態(tài)壁紙類

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

3.清單文件中聲明它蝌蹂,在定義一個圖標的xml,如下:

這里寫圖片描述

xml的內(nèi)容如下:

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

以上幾個步驟即創(chuàng)建了一個動態(tài)壁紙,只不過沒有渲染圖像而已曹锨。孤个。。當WallpaperService被系統(tǒng)創(chuàng)建時沛简,它會創(chuàng)建它自己的渲染表面(Surface),讓應用程序在上面繪制齐鲤,即通過調(diào)用Engine這個渲染引擎。下面一個步驟即最重要的一環(huán)椒楣,如何用openGL渲染的圖像在WallpaperService中顯現(xiàn)出來

4.完成壁紙的引擎

正常情況下给郊,GLSurfaceView是被加入到Activity視圖層的,GLSurfaceView會調(diào)用getHolder()存取其Activity內(nèi)的表面捧灰。在動態(tài)壁紙中我們需要改變這個行為淆九,因此我們只需重載getHolder(),讓其返回動態(tài)壁紙的渲染表面即可毛俏。

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 炭庙。當調(diào)用onDetachedFromWindow()時,GLSurfaceView 就會自動的銷毀自己煌寇。

GLWallpaperService 的全部實現(xiàn)代碼如下:

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();
            }
        }
    }
}

ps:

Kotlin可以編譯成Java字節(jié)碼焕蹄,也可以編譯成JavaScript,方便在沒有JVM的設備上運行阀溶,最近發(fā)布了Kotlin/Native能把Kotlin編譯成機器碼腻脏,也就是C/C++一樣的能力。本專題專注Kotlin淌哟,Kotlin/Native迹卢,KotlinJS與Kotlin_Android的那些事,讓我們共同學習Kotlin壯大Kotlin~

加入專題吧Kotlin-Android-KotlinJS-Kotlin/Native:http://www.reibang.com/c/e88f0f9356a8

相信各位客官已經(jīng)看的很明白了……

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徒仓,一起剝皮案震驚了整個濱河市腐碱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掉弛,老刑警劉巖症见,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異殃饿,居然都是意外死亡谋作,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門乎芳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遵蚜,“玉大人帖池,你說我怎么就攤上這事】跃唬” “怎么了睡汹?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寂殉。 經(jīng)常有香客問我囚巴,道長,這世上最難降的妖魔是什么友扰? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任彤叉,我火速辦了婚禮,結果婚禮上村怪,老公的妹妹穿的比我還像新娘秽浇。我一直安慰自己,他們只是感情好实愚,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布兼呵。 她就那樣靜靜地躺著,像睡著了一般腊敲。 火紅的嫁衣襯著肌膚如雪击喂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天碰辅,我揣著相機與錄音懂昂,去河邊找鬼。 笑死没宾,一個胖子當著我的面吹牛凌彬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播循衰,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼铲敛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了会钝?” 一聲冷哼從身側響起伐蒋,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迁酸,沒想到半個月后先鱼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡奸鬓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年焙畔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片串远。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡宏多,死狀恐怖儿惫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绷落,我是刑警寧澤姥闪,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站砌烁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏催式。R本人自食惡果不足惜函喉,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荣月。 院中可真熱鬧管呵,春花似錦、人聲如沸哺窄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萌业。三九已至坷襟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間生年,已是汗流浹背婴程。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抱婉,地道東北人档叔。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像蒸绩,于是被迫代替她去往敵國和親衙四。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容