2012-12-13 10 views
0

我正在創建我的第一個動態壁紙,其中隨機位置會產生雪,並開始動畫。但它滯後。 這是我的代碼。如何解決動態壁紙的滯後?

代碼沒有錯誤,但它滯後。如果我增加了雪的數量,它滯後更多。 如何解決滯後?

public class CybWallpaper extends WallpaperService { 

    @Override 
    public Engine onCreateEngine() { 
     return new Mywall(); 
    } 
    public class Mywall extends Engine 
    { 
     int x[]=new int[30],y[]=new int[30]; 
     int isr=0; 
     int scw,sch; 
     Canvas dra; 
     int temps[]=new int[30]; 
     boolean isft=true; 


     Handler hand=new Handler(); 
     boolean isrun; 
     Random ran=new Random(); 
     Runnable iterate=new Runnable() 
     { 
      @Override 
      public void run() { 
       slower(); 
       drawframe(); 
      } 

     }; 



     @Override 
     public void onSurfaceCreated(SurfaceHolder holder) { 
      // TODO Auto-generated method stub 
      super.onSurfaceCreated(holder); 


     } 

     @Override 
     public void onSurfaceChanged(SurfaceHolder holder, int format, 
       int width, int height) { 
      // TODO Auto-generated method stub 
      super.onSurfaceChanged(holder, format, width, height); 
      slower(); 
      drawframe(); 
     } 

     protected void drawframe() { 
      // TODO Auto-generated method stub 
      SurfaceHolder sh=getSurfaceHolder(); 


       dra = null; 
       try { 
        dra = sh.lockCanvas(); 
        if (dra != null) { 

         for(int i=0;i<30&&isft;i++) 
         { 
          x[i]=ran.nextInt(dra.getWidth()); 
          y[i]=ran.nextInt(dra.getHeight()); 
          temps[i]=30+ran.nextInt(100); 

         } 
         isft=false; 
         dra.drawARGB(255, 0,0, 0); 
         drawsnow(dra,30); 

        } 
       } finally { 
        if (dra != null) 
        sh.unlockCanvasAndPost(dra); 
       } 
     } 

     private void drawsnow(Canvas dra,int n) { 
      // TODO Auto-generated method stub 
      Bitmap snow=BitmapFactory.decodeResource(getResources(), R.drawable.snow80); 
      Bitmap te[]=new Bitmap[30]; 


      for(int i=0;i<n;i++) 
      { 
       te[i]=Bitmap.createScaledBitmap(snow, temps[i], temps[i], false); 
       dra.drawBitmap(te[i], x[i]-(te[i].getWidth()/2), y[i]-(te[i].getHeight()/2), null); 
       //Snow to and fro 
       if(isr==0&&x[i]!=140) 
        x[i]+=1; 
       else 
        isr=1; 

       if(isr==1&&x[i]!=120) 
        x[i]-=1; 
       else 
        isr=0; 

       if(y[i]<dra.getHeight()) 
        y[i]+=6; 
       else 
       { 
        y[i]=0; 
        x[i]=ran.nextInt(dra.getWidth()); 
        temps[i]=30+ran.nextInt(100); 
       } 
      } 

      //Toast.makeText(getApplicationContext(), Float.toString(cx), Toast.LENGTH_SHORT).show();    

     } 

     protected void slower() { 
      // TODO Auto-generated method stub 
      hand.removeCallbacks(iterate); 
      if (isrun) { 
       hand.postDelayed(iterate, 1000/30); 
      } 

     } 

     @Override 
     public void onSurfaceDestroyed(SurfaceHolder holder) { 
      // TODO Auto-generated method stub 
      super.onSurfaceDestroyed(holder); 
      isrun=false; 
      hand.removeCallbacks(iterate); 
      Toast.makeText(getApplicationContext(), "Destroyed", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onTouchEvent(MotionEvent event) { 
      // TODO Auto-generated method stub 
      super.onTouchEvent(event); 
     } 

     @Override 
     public void onVisibilityChanged(boolean visible) { 
      // TODO Auto-generated method stub 
      super.onVisibilityChanged(visible); 
      isrun=visible; 
      if(isrun) 
      { 
       slower(); 
       drawframe(); 
      } 
      else 
      { 
       hand.removeCallbacks(iterate); 
      } 
      //Toast.makeText(getApplicationContext(), "Visi", Toast.LENGTH_SHORT).show(); 
     } 

    } 

} 

我編碼是否正確?

回答

3
  Bitmap snow=BitmapFactory.decodeResource(getResources(), R.drawable.snow80); 
      Bitmap te[]=new Bitmap[30]; 

我想你在這裏做錯了事。你的代碼不斷decodeResource ==>浪費大量內存和CPU ==>讓你的程序變慢,而不是這樣做,你應該聲明一個全局的「雪」變量。

+0

感謝兄弟。 它現在運作良好。 –

+0

不客氣:-) – vanloi999

1

您的滯後是在解碼資源。

Bitmap snow=BitmapFactory.decodeResource(getResources(), R.drawable.snow80); 
Bitmap te[]=new Bitmap[30]; 

我將其移至onSurfaceCreated功能,並使用一個成員對象。