2010-11-29 33 views
2

J'essaie de faire ce qui suit d'un tutoriel de fond d'écran en direct, j'ai trouvé here.Live Wallpaper Tutoriel

/** 
* Do the actual drawing stuff 
*/ 
private void doDraw(Canvas canvas) { 
    Bitmap b = BitmapFactory.decodeResource(context.getResources(), IMAGES[current]); 
    canvas.drawColor(Color.BLACK); 
    canvas.drawBitmap(b, 0, 0, null); 
    Log.d(TAG, "Drawing finished."); 
} 

/** 
* Update the animation, sprites or whatever. 
* If there is nothing to animate set the wait 
* attribute of the thread to true 
*/ 
private void updatePhysics() { 
    // if nothing was updated : 
    // this.wait = true; 
    if(previousTime - System.currentTimeMillis() >= 41) { //24 FPS 
     current = current < IMAGES.length ? current++ : 0; 
    } 
    Log.d(TAG, "Updated physics."); 
} 

Mais cela ne semble pas fonctionner. Qu'est-ce que je fais mal. Le "Dessin terminé." et "Physique mise à jour". les messages sont imprimés. Mais je vois la première image seulement. Je le teste sur l'émulateur.

Toute aide serait appréciée. Merci

+2

Hmm, qu'est-ce que 'previousTime' contiennent? Je suppose que vous attendez que cette variable soit mise à jour. Que dit le débogueur si vous mettez un point d'arrêt sur le 'if (previousTime ...)' et inspectez l'expression? – mreichelt

+0

Merci de m'avoir signalé. Travaille bien maintenant. –

Répondre

10

J'ai travaillé sur un simple fond d'écran en direct où la couleur change au fil du temps. Peut-être vous pouvez l'utiliser comme point de départ:

package com.cmwmobile.android.samples; 

import android.graphics.Canvas; 

import android.os.Handler; 

import android.service.wallpaper.WallpaperService; 

import android.view.SurfaceHolder; 

/** 
* The SampleLiveWallpaperService class is responsible for showing the 
* animation and is an interface to android. 
* @author Casper Wakkers - www.cmwmobile.com 
*/ 
public class SampleLiveWallpaperService extends WallpaperService { 
    private Handler handler = null; 

    /** 
    * Inner class representing the actual implementation of the 
    * Live Wallpaper {@link Engine}. 
    */ 
    private class SampleLiveWallpaperEngine extends Engine { 
     private boolean visible = false; 

     private int[] colors = {0, 0, 0} ; 

     /** 
     * Runnable implementation for the actual work. 
     */ 
     private final Runnable runnableSomething = new Runnable() { 
      /** 
      * {@inheritDoc} 
      */ 
      public void run() { 
       drawSomething(); 
      } 
     }; 
     /** 
     * The drawSomething method is responsible for drawing the animation. 
     */ 
     private void drawSomething() { 
      final SurfaceHolder holder = getSurfaceHolder(); 

      Canvas canvas = null; 

      try { 
       canvas = holder.lockCanvas(); 

       if (canvas != null) { 
        canvas.drawARGB(200, colors[0], colors[1], colors[2]); 
       } 

       updateColors(colors); 
      } 
      finally { 
       if (canvas != null) { 
        holder.unlockCanvasAndPost(canvas); 
       } 
      } 

      // Reschedule the next redraw. 
      handler.removeCallbacks(runnableSomething); 

      if (visible) { 
       // Play around with the delay for an optimal result. 
       handler.postDelayed(runnableSomething, 25); 
      } 
     } 
     /** 
     * Method updateColors updates the colors by increasing the value 
     * per RGB. The values are reset to zero if the maximum value is 
     * reached. 
     * @param colors to be updated. 
     */ 
     private void updateColors(int[] colors) { 
      if (colors[0] < 255) { 
       colors[0]++; 
      } 
      else { 
       if (colors[1] < 255) { 
        colors[1]++; 
       } 
       else { 
        if (colors[2] < 255) { 
         colors[2]++; 
        } 
        else { 
         colors[0] = 0; 
         colors[1] = 0; 
         colors[2] = 0; 
        } 
       } 
      } 
     } 
     /** 
     * {@inheritDoc} 
     */ 
     public void onDestroy() { 
      super.onDestroy(); 

      handler.removeCallbacks(runnableSomething); 
     } 
     /** 
     * {@inheritDoc} 
     */ 
     public void onVisibilityChanged(boolean visible) { 
      super.onVisibilityChanged(visible); 

      this.visible = visible; 

      if (visible) { 
       drawSomething(); 
      } 
      else { 
       handler.removeCallbacks(runnableSomething); 
      } 
     } 
    } 

    /** 
    * Constructor. Creates the {@link Handler}. 
    */ 
    public SampleLiveWallpaperService() { 
     handler = new Handler(); 
    } 
    /** 
    * {@inheritDoc} 
    */ 
    public Engine onCreateEngine() { 
     return new SampleLiveWallpaperEngine(); 
    } 
}