1. 程式人生 > >Android 設定gif動態桌面

Android 設定gif動態桌面

  Android設定桌面主要用到了WallPaperService這個類。首先建立自己的類繼承WallPaperService並重寫onCreateEngine()方法,建立自己的Engine。

 1、建立自己的Engine類GifEngine 繼承Engine,重寫裡面的onSurfaceCreated方法,onVisibilityChanged方法,onSurfaceDestroy方法。在onSurfaceCreate方法中載入gif動畫,這裡涉及到gif動畫的載入與播放,涉及到Movie類,用movie解碼gif檔案然後畫在canvas上,並重復一幀一幀的繪製。這樣就能將gif動畫渲染到surfaceView上呈現到螢幕。

   onVisibilityChanged方法在桌面可見不可見的時候進行回撥,當螢幕可見的時候進行播放,螢幕不可見取消gif繪製。onSurfaceDestroy銷燬的時候銷燬操作。類如下:

public class GIfWallPaperService extends WallpaperService {
    private Movie movie;
    private Handler handler;
    private boolean isVisible;
    private int height;
    private int width;
    private int 
gifWidth; private int gifHeigth; @Override public Engine onCreateEngine() { return new GifEngine(); } class GifEngine extends Engine { @Override public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); handler = new Handler(); try
{ InputStream inputStream = getContentResolver().openInputStream(Config.filePath);movie = Movie.decodeStream(inputStream); DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); height = displayMetrics.heightPixels; width = displayMetrics.widthPixels; gifWidth = movie.width(); gifHeigth = movie.height(); } catch (FileNotFoundException e) { e.printStackTrace(); } } @Override public void onVisibilityChanged(boolean visible) { if (visible) { isVisible = true; handler.post(runnable); } else { isVisible = false; handler.removeCallbacks(runnable); } } @Override public void onSurfaceDestroyed(SurfaceHolder holder) { super.onSurfaceDestroyed(holder); handler.removeCallbacks(runnable); }private Runnable runnable = new Runnable() { @Override public void run() { if (isVisible) {Canvas canvas = getSurfaceHolder().lockCanvas();canvas.save(); canvas.scale(2 , 2 );movie.draw(canvas, 0, 0);movie.setTime((int) (System.currentTimeMillis() % movie.duration())); canvas.restore();getSurfaceHolder().unlockCanvasAndPost(canvas); handler.postDelayed(runnable, 50); //50ms表示每50m繪製一次 } } }; } }

2、配置AndroidMainfest.xml 

<service android:name=".service.GIfWallPaperService"
android:label="@string/gif_wallpaper"
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/gif_wallpaper" />
</service>

3、配置gif_wallpaper.xml

<?xml version="1.0" encoding="utf-8"?><wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
android:thumbnail="@mipmap/ic_launcher"
android:description="@string/gif_description"
/>

4、配置strings.xml

<string name="gif_description">gif動態桌布</string>

5、配置許可權

<uses-permission android:name="android.permission.SET_WALLPAPER" />

6、啟動GifService

Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,new ComponentName(context, GIfWallPaperService.class));
startActivity(intent);
這樣就可以實現gif動畫載入了