GLWallpaperService 분석 1

WallpaperService는 동적 벽지를 실현하는 서비스로 WallpaperService를 사용하는 전형적인 방식은 WallpaperService에서 계승된 동적 벽지 종류를 사용자 정의하는 것이다.WallpaperService를 구현합니다.Engine.WallpaperService onCreateEngine() 방법은 이engine의 실례를 되돌려줍니다.
 
일반적인 사용자 지정 동적 배경 그림은 다음과 같습니다.
AndroidManifest.xml
<service
                            android:label="@string/app_name"
                            android:name=".LiveWallpaper"
                            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/livewallpaper" />
</service>

이루어지다
public class LiveWallpaper extends WallpaperService
{
         @Override
         public Engine onCreateEngine()
         {
                   return new MyEngine();
         }
 
         class MyEngine extends Engine
         {
                   Handler mHandler = new Handler();
                   private final Runnable drawTarget = new Runnable()
                   {
                            public void run()
                            {
                                     drawFrame();
                            }
                   };
        @Override
                   public void onCreate(SurfaceHolder surfaceHolder)
                   {
                            super.onCreate(surfaceHolder);
                            setTouchEventsEnabled(true);
                   }
 
                   @Override
                   public void onDestroy()
                   {
                            super.onDestroy();
                            //     
                            mHandler.removeCallbacks(drawTarget);
                   }
 
                   @Override
                   public void onVisibilityChanged(boolean visible)
                   {
                            mVisible = visible;
                            //        ,  drawFrame()  。
                            if (visible)
                            {
                                     drawFrame();
                            }
                            else
                            {
                                     //        ,    
                                     mHandler.removeCallbacks(drawTarget);
                            }
                   }
 
                   @Override
                   public void onOffsetsChanged(float xOffset, float yOffset, float xStep,
                            float yStep, int xPixels, int yPixels)
                   {
                            drawFrame();
                   }
 
                   @Override
                   public void onTouchEvent(MotionEvent event)
                   {
                 //            
                            super.onTouchEvent(event);
                   }
                   private void drawFrame()
                   {
                            final SurfaceHolder holder = getSurfaceHolder();
                            Canvas c = null;
                            try
                            {
                                     //      
                                     c = holder.lockCanvas();
                                     if (c != null)
                                     {
                 //  Canvas       

 
위 코드는 미친 안드로이드 강의의 예시 코드에서 발췌한 것으로 그 자체가 참고된 안드로이드 예시 원본의 CubeLiveWallpaper 동적 벽지(Android4.2\android\development\samples\CubeLiveWallpaper)
 
WallpaperService 자체가 하나의 서비스이기 때문에 UI에서 직접 그림을 그릴 수 없고surface 위의 화면을 잠그고 캔버스로 되돌아오는 것을 알 수 있습니다.그리고 캔버스에 그림이나 색상, 모양 등을 그려 그린 뒤 화면에 대한 잠금을 풀고 캔버스를 화면에 보여준다.
이런 방법은 우리가 보여주고 싶은 애니메이션을 신속하게 처리할 수 없을 것이다. 예를 들어 손가락이 미끄러지는 물결을 그리는 것이다. 이런 효과는 Canvas가 그릴 때 슬라이드처럼 끊기는 것이 아니라 더 빠른 전시가 필요하다.
이 방면의 예는 유명한 Jake Wharton(Action Bar Sherlock, Android-View Pager Indicator, butterk nife, Nine Old Androids 작가)의 초기 작품인 Breakout Wallpaper, Snake Wallpaper, Waka Wallpaper, Tron Wallpaper의 실현 효과는 모두 한 프레임 한 프레임의 애니메이션이다.
 
안드로이드 시스템이 자체로 가지고 있는 동적 벽지는MagicSmoke 등이다.왜 유창한 애니메이션 효과를 실현할 수 있습니까?
RenderScript 스크립트를 사용하고 render 스크립트를 사용하여 기초적인surface 화면을 렌더링하기 때문입니다.
1,RenderScriptGL  mRs = newRenderScriptGL(RenderScriptWallpaper.this, sc); //  WallpaperService Context    RenderScript 。
2,mRs.setSurface(holder,width, height);// WallpaperService Surface    。
3,mRenderer.init(mRs,getResources(), isPreview());//  rs    
4,mRenderer.start(); //    rs  

 
이렇게 하면 효율적인 렌더링 스크립트를 통해 화면을 직접 그리고 동적 벽지를 유창하게 그릴 수 있다.
 
rs 스크립트에 익숙하지 않은 코드는 자신이 동적 벽지를 실현할 때surface를 직접 그려서 동적 벽지를 진정으로 원활하게 운행할 수 있습니까?
답은 긍정적이다.Mark F Guerra의github에는 OpenGL을 사용하는 안드로이드 동적 벽지 라이브러리인 GL Wallpaper 서비스가 구현되어 있습니다.이 라이브러리를 사용하면 OpenGL을 사용하여 빠르게 렌더링되는 동적 벽지를 더욱 신속하게 실현할 수 있습니다.OpenGL을 Android에서 사용하는 방법은 다음 자습서를 참조하십시오.
http://www.jayway.com/tag/opengl-es/
심지어 유명한 벽지 소프트웨어인 무즈도 이 라이브러리를 사용했다.관심 있는 건 참고해도 돼요.
 
다음에 다음과 같은 분석이 수행됩니다.
GLWallpaperService 사용
GLWallpaperService 구현 분석
 
 

좋은 웹페이지 즐겨찾기