2013-12-12 2 views
1

내 프레임 애니메이션이 뒤쳐져 있습니다. 왜 뒤쳐지는거야?라이브 배경 화면, 프레임 애니메이션, 지연 l

코드 : 추첨 스레드에서

public class LiveWallpaperService extends WallpaperService { 

    Bitmap mPic; 
    private final Handler mHandler = new Handler(); 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

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

    @Override 
    public Engine onCreateEngine() { 
     return new CubeEngine(); 
    } 

    class CubeEngine extends Engine { 

     private float mPosY, mPosX; 

     private Matrix mMatrix = new Matrix(); 
     private int k = 1; 
     private boolean mAnime = true; 

     private boolean test; 
     private static final int NUM_RES = 30; 

     private final Runnable mDrawAnim = new Runnable() { 
      public void run() { 

       for (int i = 0; i < 31; i++) { 
        k++; 
        drawFrame(); 

        if (i == 30) { 
         k = 1; 
        } 

       } 

      } 

     }; 

     private boolean mVisible; 

     CubeEngine() { 

      Resources res = getResources(); 
      for (int i = 0; i < NUM_RES; i++) { 
       int id = res.getIdentifier("boot_00" + (100 + (i + 1)), 
         "drawable", "com.example.dxd1"); 
       mPic = BitmapFactory.decodeResource(res, id); 

      } 

     } 

     @Override 
     public void onCreate(SurfaceHolder surfaceHolder) { 

      super.onCreate(surfaceHolder); 

      setTouchEventsEnabled(false); 
     } 

     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
      mHandler.removeCallbacks(mDrawAnim); 
     } 

     @Override 
     public void onVisibilityChanged(boolean visible) { 
      mVisible = visible; 
      if (visible) { 
      drawFrame(); 
      }else { 
       mHandler.removeCallbacks(mDrawAnim); 
      } 
     } 

     @Override 
     public void onSurfaceChanged(SurfaceHolder holder, int format, 
       int width, int height) { 
      super.onSurfaceChanged(holder, format, width, height); 

      float w = mPic.getWidth(); 
      float h = mPic.getHeight(); 
      float s = width/(float) w; 
      float s2 = height/(float) h; 

      mMatrix.reset(); 
      mMatrix.setScale(s, s2); 


     } 

     @Override 
     public void onSurfaceCreated(SurfaceHolder holder) { 
      super.onSurfaceCreated(holder); 

     } 

     @Override 
     public void onSurfaceDestroyed(SurfaceHolder holder) { 
      super.onSurfaceDestroyed(holder); 
      mVisible = false; 
      mHandler.removeCallbacks(mDrawAnim); 
     } 

     public void updateBG() { 

      if (k == 1) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00101); 

      } 
      if (k == 2) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00102); 

      } 
      if (k == 3) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00103); 

      } 
      if (k == 4) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00104); 

      } 
      if (k == 5) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00105); 

      } 
      if (k == 6) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00106); 

      } 
      if (k == 7) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00107); 

      } 
      if (k == 8) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00108); 

      } 
      if (k == 9) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00109); 

      } 
      if (k == 10) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00110); 

      } 
      if (k == 11) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00111); 

      } 
      if (k == 12) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00112); 

      } 
      if (k == 13) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00113); 

      } 
      if (k == 14) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00114); 

      } 

      if (k == 15) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00115); 

      } 
      if (k == 16) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00116); 

      } 
      if (k == 17) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00117); 

      } 
      if (k == 18) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00118); 

      } 
      if (k == 19) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00119); 

      } 
      if (k == 20) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00120); 

      } 
      if (k == 21) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00121); 

      } 
      if (k == 22) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00122); 

      } 
      if (k == 23) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00123); 

      } 
      if (k == 24) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00124); 

      } 
      if (k == 25) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00125); 

      } 
      if (k == 26) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00126); 

      } 
      if (k == 27) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00127); 

      } 
      if (k == 28) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00128); 

      } 
      if (k == 29) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00129); 

      } 
      if (k == 30) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00130); 

      } 

     } 

     void drawFrame() { 
      final SurfaceHolder holder = getSurfaceHolder(); 

      Canvas c = null; 

      c = holder.lockCanvas(); 
      if (c != null) { 

       drawAnim(c); 

      } 

      if (c != null) { 
       holder.unlockCanvasAndPost(c); 
      } 
      // Reschedule the next redraw 
      mHandler.removeCallbacks(mDrawAnim); 
      if (mVisible && mAnime) { 
       mHandler.postDelayed(mDrawAnim, 50); 
      } 

     } 

     void drawAnim(Canvas c) { 

      updateBG(); 

      c.drawBitmap(mPic, mMatrix, null); 

     } 

    } 
+0

나는이 코드를 전혀 테스트하지 않았지만,'updateBG()'는 확실히 고쳐질 수 있었다; 왜'switch' /'case'를 쓰는 대신에'if' 명령문을 모두 사용하고 있습니까? – admdrew

답변

1

디코딩 비트 맵은 아주 아주 무거운, 그리고 확실히 지연이 발생합니다. 모든 프레임에 대해 전체 화면 비트 맵을 사용하여 애니메이션을 그릴 수는 없습니다. 당신은 캐쉬해야 할 것입니다 (거의 그렇지 않을 것입니다. 너무 많은 전체 화면 비트 맵으로 램이 부족할 것이기 때문에), 또는 내용을 프로그래밍 방식으로 그리거나 (동적으로 생성 된 이미지) 또는 부분적인 비트 맵/레이어만을 사용해야합니다. sprites라고 불렀다.) 그리고 그 부분들을 움직인다.

비트 맵이있는 전체 화면 애니메이션 인트로와 함께 클라이언트 용 앱을 개발했으며 대부분의 기기에서 5fps에 도달하지 못했지만 (원래) iphone 버전은 훨씬 더 많이 도달했습니다. 나는 다른 호환 문제가있는 h264로 인코딩 된 영화를 사용했다. 그래서, 이렇게하면 효과가 없을 것입니다.

그래서 중요한 질문은 왜 무언가를 그리는 데 30 비트 맵을 사용하고 있습니까? 레이어를 사용할 수 없으므로 작은 비트 맵을 사용합니까? 어쩌면 그들 자신을 움직일 수 있을까요? 수동으로 애니메이션을 적용하는 대신 영화를 사용하지 않는 이유는 무엇입니까? 전체 화면 이미지를 사용하고 있습니까?

전체 화면 이미지를 사용하지 않는 경우 일종의 사전 캐싱을 구현하여 렌더링 전에 비트 맵에 이미 2 개의 이미지를 디코딩 했으므로 캐시를 업데이트 할 수 있습니다.

+0

매끄러운 이미지 전체 화면에서 30 비트 맵 애니메이션이 필요합니다. 인스턴트 메신저를위한 벽지를 만들면 작은 비트 맵을 사용하면 이미지 품질이 떨어집니다. 레이어를 사용하는 방법? – user3091874

+0

레이어는 서로 위에 그려주는 비트 맵입니다. 따라서 비트 맵에 따라 다릅니다. 예를 들어 이미지를 중심으로 원이 움직이는 경우 수동으로 지정된 위치에 원 이미지의 작은 이미지와 이미지를 렌더링 할 수 있습니다. 그러나 다른 사람들이 그런 배경 화면을 어떻게 만들어야하는지 스스로 조사해야 할 것 같습니다. 나는 그들이 전체 화면 비트 맵을 사용하지 않지만 더 동적으로 생성 된 것들을 사용한다고 생각한다. – Peterdk

관련 문제