2012-12-13 7 views
0

눈이 무작위로 생성되고 애니메이션이 시작되는 첫 번째 라이브 배경 화면을 만들고 있습니다.하지만 느리게 생성됩니다. 이것은 내 코드입니다.라이브 배경 화면에서 지연을 해결하는 방법은 무엇입니까?

코드에 오류가 없다하지만 난 눈이의 수, 그것은 더 지연 증가 lags.If. 지연을 해결하는 방법?

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 기능이 이동하고 구성원 개체를 사용합니다.