2012-02-06 15 views
22

Sono nuovo alla piattaforma Android. Desidero sviluppare una applicazione live wallpaper live. Quando sono stato perquisito su questo motore di ricerca, molti di loro hanno creato uno sfondo dal vivo come codice (usando SurfaceView e Canvas), non ne sono molto consapevole. Qui il mio dubbio è, qualsiasi possibile impostare le immagini .gif come sfondo animato.È possibile impostare un file GIF animato come sfondo animato in Android?

+0

Fare riferimento [a questa risposta] (http://stackoverflow.com/a/7772170/967142) – Jens

+0

@Jens: grazie per il vostro riproduzione, se si dispone di alcun codice di esempio come fai questo, – Aerrow

+0

Bene, questo ti mostra [come] (http: //droid-blog.n et/2011/10/14/tutorial-how-to-use-gif animate-in-android-part-1 /) – Jens

risposta

45

Questo è il servizio di base dello sfondo (come fornito nell'esercitazione Live Wallpaper) hackerato per visualizzare una gif animata.

Primo: crea un progetto & imposta il file manifest come sfondo animato.
Poi - scaricare una gif, come questo
      nyan nyan

Salva che gif in res/raw/nyan.gif nel progetto.
Creare un servizio di sfondi animati, come mostrato in questo esempio.

public class NyanNyanService extends WallpaperService { 
    static final String TAG = "NYAN"; 
    static final Handler mNyanHandler = new Handler(); 

    /** 
    * @see android.service.wallpaper.WallpaperService#onCreate() 
    */ 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    /** 
    * @see android.service.wallpaper.WallpaperService#onCreateEngine() 
    */ 
    @Override 
    public Engine onCreateEngine() { 
     try { 
      return new NyanEngine(); 
     } catch (IOException e) { 
      Log.w(TAG, "Error creating NyanEngine", e); 
      stopSelf(); 
      return null; 
     } 
    } 

    class NyanEngine extends Engine { 
     private final Movie mNyan; 
     private final int mNyanDuration; 
     private final Runnable mNyanNyan; 
     float mScaleX; 
     float mScaleY; 
     int mWhen; 
     long mStart; 

     NyanEngine() throws IOException { 
      InputStream is = getResources().openRawResource(R.raw.nyan); 
      if (is != null) { 
       try { 
        mNyan = Movie.decodeStream(is); 
        mNyanDuration = mNyan.duration(); 
       } finally { 
        is.close(); 
       } 
      } else { 
       throw new IOException("Unable to open R.raw.nyan"); 
      } 

      mWhen = -1; 
      mNyanNyan = new Runnable() { 
       public void run() { 
        nyan(); 
       } 
      }; 
     } 

     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
      mNyanHandler.removeCallbacks(mNyanNyan); 
     } 

     @Override 
     public void onVisibilityChanged(boolean visible) { 
      super.onVisibilityChanged(visible); 
      if (visible) { 
       nyan(); 
      } else { 
       mNyanHandler.removeCallbacks(mNyanNyan); 
      } 
     } 

     @Override 
     public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
      super.onSurfaceChanged(holder, format, width, height); 
      mScaleX = width/(1f * mNyan.width()); 
      mScaleY = height/(1f * mNyan.height()); 
      nyan(); 
     } 

     @Override 
     public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, 
       float yOffsetStep, int xPixelOffset, int yPixelOffset) { 
      super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset); 
      nyan(); 
     } 

     void nyan() { 
      tick(); 
      SurfaceHolder surfaceHolder = getSurfaceHolder(); 
      Canvas canvas = null; 
      try { 
       canvas = surfaceHolder.lockCanvas(); 
       if (canvas != null) { 
        nyanNyan(canvas); 
       } 
      } finally { 
       if (canvas != null) { 
        surfaceHolder.unlockCanvasAndPost(canvas); 
       } 
      } 
      mNyanHandler.removeCallbacks(mNyanNyan); 
      if (isVisible()) { 
       mNyanHandler.postDelayed(mNyanNyan, 1000L/25L); 
      } 
     } 

     void tick() { 
      if (mWhen == -1L) { 
       mWhen = 0; 
       mStart = SystemClock.uptimeMillis(); 
      } else { 
       long mDiff = SystemClock.uptimeMillis() - mStart; 
       mWhen = (int) (mDiff % mNyanDuration); 
      } 
     } 

     void nyanNyan(Canvas canvas) { 
      canvas.save(); 
      canvas.scale(mScaleX, mScaleY); 
      mNyan.setTime(mWhen); 
      mNyan.draw(canvas, 0, 0); 
      canvas.restore(); 
     } 
    } 
} 

Questo sarà essenzialmente scalare il gatto Nyan-nyan per adattarsi allo schermo e animare in perpetuo.

Una carta da parati manifesta vivo guarda specie-di-così (questo esempio non contiene un'attività di configurazione):

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="your.nyan.nyan.package" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="10" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/application_nyan" > 
     <service 
      android:label="@string/wallpaper_nyan" 
      android:name=".NyanNyanService" 
      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/nyan" /> 
     </service> 
    </application> 
</manifest> 

L'AndroidManifest.xml ha un riferimento ad un file in res/xml, in questo caso il nome "nyan.xml":

<?xml version="1.0" encoding="utf-8"?> 
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android" /> 
+0

ma non c'è uscita sullo schermo, nella mia console mostra, cat = [android.intent.category.LAUNCHER] flg = 0x10000000 cmp = test.anim/.NyanNyanService} da null (pid = 7019, uid = 2000) richiede android.permission.BIND_WALLPAPER – Aerrow

+0

Penso di fare errori nel file manifest, potresti pubblicare il file manifest. – Aerrow

+0

hm. Sì, non è possibile avviare uno sfondo live da qualsiasi cosa che non contenga l'autorizzazione BIND_WALLPAPER (che è riservata alle applicazioni di sistema), ad esempio per testare lo sfondo, selezionarlo nel raccoglitore di sfondi live nella schermata iniziale. – Jens