2015-02-17 3 views
1

У меня проблема. Я пишу живые обои для андроида с кадровой анимацией, и я уже закончил ее, но анимация играет очень медленно примерно 1 кадр в секунду.Android кадр за кадром живые обои анимация

Вот мой код

public class WallpaperSer extends WallpaperService { 

    static final Handler mHandler = new Handler(); 

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

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

    public Engine onCreateEngine() { 
     return new WallpaperSerEngine(); 
    } 

    class WallpaperSerEngine extends Engine { 
     private boolean mVisible; 
     private float mScaleX; 
     private float mScaleY; 
     private Bitmap icon; 
     private Runnable diwaliImg; 

     int i = 0; 
     int[] pirates = { 
       R.drawable.final_0001, 
       R.drawable.final_0002, 
       R.drawable.final_0003, 
       R.drawable.final_0004, 
       R.drawable.final_0005, 
       R.drawable.final_0006, 
       R.drawable.final_0007, 
       R.drawable.final_0008, 
       R.drawable.final_0009, 
       R.drawable.final_0010, 
       R.drawable.final_0011, 
       R.drawable.final_0012, 
       R.drawable.final_0013, 
       R.drawable.final_0014, 
       R.drawable.final_0015, 
       R.drawable.final_0016, 
       R.drawable.final_0017, 
       R.drawable.final_0018, 
       R.drawable.final_0019, 
       R.drawable.final_0020, 
       R.drawable.final_0021, 
       R.drawable.final_0022, 
       R.drawable.final_0023, 
       R.drawable.final_0024, 
       R.drawable.final_0025, 
       R.drawable.final_0026, 
       R.drawable.final_0027, 
       R.drawable.final_0028, 
       R.drawable.final_0029, 
       R.drawable.final_0030, 
       R.drawable.final_0031, 
       R.drawable.final_0032, 
       R.drawable.final_0033, 
       R.drawable.final_0034, 
       R.drawable.final_0035, 
       R.drawable.final_0036, 
       R.drawable.final_0037, 
       R.drawable.final_0038, 
       R.drawable.final_0039, 
       R.drawable.final_0040, 
       R.drawable.final_0041, 
       R.drawable.final_0042, 
       R.drawable.final_0043, 
       R.drawable.final_0044, 
       R.drawable.final_0045, 
       R.drawable.final_0046, 
       R.drawable.final_0047, 
       R.drawable.final_0048, 
       R.drawable.final_0049, 
       R.drawable.final_0050, 
       R.drawable.final_0051, 
       R.drawable.final_0052, 
       R.drawable.final_0053, 
       R.drawable.final_0054, 
       R.drawable.final_0065, 
       R.drawable.final_0056, 
       R.drawable.final_0057, 
       R.drawable.final_0058, 
       R.drawable.final_0059, 
       R.drawable.final_0060, 
       R.drawable.final_0061, 
       R.drawable.final_0062, 
       R.drawable.final_0063, 
       R.drawable.final_0064, 
       R.drawable.final_0065, 
       R.drawable.final_0066, 
       R.drawable.final_0067, 
       R.drawable.final_0068, 
       R.drawable.final_0069, 
       R.drawable.final_0070, 
       R.drawable.final_0071, 
       R.drawable.final_0072, 
       R.drawable.final_0073, 
       R.drawable.final_0074, 
       R.drawable.final_0075, 
       R.drawable.final_0076, 
       R.drawable.final_0077, 
       R.drawable.final_0078, 
       R.drawable.final_0079, 
       R.drawable.final_0080, 
       R.drawable.final_0081, 
       R.drawable.final_0082, 
       R.drawable.final_0083, 
       R.drawable.final_0084, 
       R.drawable.final_0085, 
       R.drawable.final_0086, 
       R.drawable.final_0087, 
       R.drawable.final_0088, 
       R.drawable.final_0089, 
       R.drawable.final_0090, 
       R.drawable.final_0091, 
       R.drawable.final_0092, 
       R.drawable.final_0093, 
       R.drawable.final_0094, 
       R.drawable.final_0095, 
       R.drawable.final_0096, 
       R.drawable.final_0097, 
       R.drawable.final_0098, 
       R.drawable.final_0099, 
       R.drawable.final_0100, 
       R.drawable.final_0101, 
       R.drawable.final_0102, 
       R.drawable.final_0103, 
       R.drawable.final_0104, 
       R.drawable.final_0105, 
       R.drawable.final_0106, 
       R.drawable.final_0107, 
       R.drawable.final_0108, 
       R.drawable.final_0109, 
       R.drawable.final_0110, 
       R.drawable.final_0111, 
       R.drawable.final_0112, 
       R.drawable.final_0113, 
       R.drawable.final_0114, 
       R.drawable.final_0115, 
       R.drawable.final_0116, 
       R.drawable.final_0117, 
       R.drawable.final_0118, 
       R.drawable.final_0119, 
       R.drawable.final_0120 
     }; 

     WallpaperSerEngine() { 
      diwaliImg = new Runnable() { 
       public void run() { 
        drawFrame(); 
       } 
      }; 
     } 

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

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

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

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

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

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


     @Override 
     public void onOffsetsChanged(float xOffset, float yOffset, float xStep,float yStep, int xPixels, int yPixels) { 
      drawFrame(); 
     } 

     @Override 
     public void onTouchEvent(MotionEvent event) { 
      super.onTouchEvent(event); 
     } 

     private void drawFrame() { 
      final SurfaceHolder holder = getSurfaceHolder(); 
      Canvas c = null; 
      try { 
       c = holder.lockCanvas(); 
       if (c != null) { 
        drawPirate(c); 
       } 
      } finally { 
       if (c != null) 
        holder.unlockCanvasAndPost(c); 
      } 
      mHandler.removeCallbacks(diwaliImg); 
      if (mVisible) { 
       mHandler.postDelayed(diwaliImg, 1000/25); 
      } 
     } 

     private void drawPirate(Canvas c) { 
      icon = BitmapFactory.decodeResource(getResources(), pirates[i]); 
      i++; 
      if (i == 120) { 
       i = 0; 
      } 
      Matrix matrix = new Matrix(); 
      c.scale(mScaleX, mScaleY); 
      c.drawBitmap(icon, matrix, null); 
      icon.recycle(); 
     } 
    } 
} 

Что я делаю не так?

UPDATE # 1 Мой журнал ошибок с @chipopo кодом:

java.lang.IllegalArgumentException: Проблема декодирования в существующие растровое в android.graphics.BitmapFactory.decodeResource (BitmapFactory.java: 482) в dajver.com.framebyframelivewallpaper.WallpaperSer $ WallpaperSerEngine.setToFrame (WallpaperSer.java:188) в dajver.com.framebyframelivewallpaper.WallpaperSer $ WallpaperSerEngine.drawPirate (WallpaperSer.java:266) в dajver.com.framebyframelivewal lpaper.WallpaperSer $ WallpaperSerEngine.drawFrame (WallpaperSer.java:253) на dajver.com.framebyframelivewallpaper.WallpaperSer $ WallpaperSerEngine.onSurfaceChanged (WallpaperSer.java:219) на android.service.wallpaper.WallpaperService $ Engine.updateSurface (WallpaperService. java: 783) на android.service.wallpaper.WallpaperService $ Engine.attach (WallpaperService.java:890) на android.service.wallpaper.WallpaperService $ IWallpaperEngineWrapper.executeMessage (WallpaperService.java:1157) на com.android. internal.os.HandlerCaller $ MyHandler.handleMessage (HandlerCaller.java:37) at android.os.Handler.dispatchMessage (Handler.java:102) at android.os.Looper.loop (Looper.java:135) at android.app.ActivityThread.main (ActivityThread.java: 5221) по адресу java.lang.reflect.Method.invoke (собственный метод) по адресу java.lang.reflect.Method.invoke (Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:899) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694)

и мой код с исправлениями, что @chipppo написал

public class WallpaperSer extends WallpaperService { 

    static final Handler mHandler = new Handler(); 

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

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

    public Engine onCreateEngine() { 
     return new WallpaperSerEngine(); 
    } 

    class WallpaperSerEngine extends Engine { 
     private boolean mVisible; 
     private float mScaleX; 
     private float mScaleY; 
     private Bitmap icon; 
     private Runnable diwaliImg; 

     int i = 0; 
     int[] pirates = { 
       R.drawable.final_0001, 
       R.drawable.final_0002, 
       R.drawable.final_0003, 
       R.drawable.final_0004, 
       R.drawable.final_0005, 
       R.drawable.final_0006, 
       R.drawable.final_0007, 
       R.drawable.final_0008, 
       R.drawable.final_0009, 
       R.drawable.final_0010, 
       R.drawable.final_0011, 
       R.drawable.final_0012, 
       R.drawable.final_0013, 
       R.drawable.final_0014, 
       R.drawable.final_0015, 
       R.drawable.final_0016, 
       R.drawable.final_0017, 
       R.drawable.final_0018, 
       R.drawable.final_0019, 
       R.drawable.final_0020, 
       R.drawable.final_0021, 
       R.drawable.final_0022, 
       R.drawable.final_0023, 
       R.drawable.final_0024, 
       R.drawable.final_0025, 
       R.drawable.final_0026, 
       R.drawable.final_0027, 
       R.drawable.final_0028, 
       R.drawable.final_0029, 
       R.drawable.final_0030, 
       R.drawable.final_0031, 
       R.drawable.final_0032, 
       R.drawable.final_0033, 
       R.drawable.final_0034, 
       R.drawable.final_0035, 
       R.drawable.final_0036, 
       R.drawable.final_0037, 
       R.drawable.final_0038, 
       R.drawable.final_0039, 
       R.drawable.final_0040, 
       R.drawable.final_0041, 
       R.drawable.final_0042, 
       R.drawable.final_0043, 
       R.drawable.final_0044, 
       R.drawable.final_0045, 
       R.drawable.final_0046, 
       R.drawable.final_0047, 
       R.drawable.final_0048, 
       R.drawable.final_0049, 
       R.drawable.final_0050, 
       R.drawable.final_0051, 
       R.drawable.final_0052, 
       R.drawable.final_0053, 
       R.drawable.final_0054, 
       R.drawable.final_0065, 
       R.drawable.final_0056, 
       R.drawable.final_0057, 
       R.drawable.final_0058, 
       R.drawable.final_0059, 
       R.drawable.final_0060, 
       R.drawable.final_0061, 
       R.drawable.final_0062, 
       R.drawable.final_0063, 
       R.drawable.final_0064, 
       R.drawable.final_0065, 
       R.drawable.final_0066, 
       R.drawable.final_0067, 
       R.drawable.final_0068, 
       R.drawable.final_0069, 
       R.drawable.final_0070, 
       R.drawable.final_0071, 
       R.drawable.final_0072, 
       R.drawable.final_0073, 
       R.drawable.final_0074, 
       R.drawable.final_0075, 
       R.drawable.final_0076, 
       R.drawable.final_0077, 
       R.drawable.final_0078, 
       R.drawable.final_0079, 
       R.drawable.final_0080, 
       R.drawable.final_0081, 
       R.drawable.final_0082, 
       R.drawable.final_0083, 
       R.drawable.final_0084, 
       R.drawable.final_0085, 
       R.drawable.final_0086, 
       R.drawable.final_0087, 
       R.drawable.final_0088, 
       R.drawable.final_0089, 
       R.drawable.final_0090, 
       R.drawable.final_0091, 
       R.drawable.final_0092, 
       R.drawable.final_0093, 
       R.drawable.final_0094, 
       R.drawable.final_0095, 
       R.drawable.final_0096, 
       R.drawable.final_0097, 
       R.drawable.final_0098, 
       R.drawable.final_0099, 
       R.drawable.final_0100, 
       R.drawable.final_0101, 
       R.drawable.final_0102, 
       R.drawable.final_0103, 
       R.drawable.final_0104, 
       R.drawable.final_0105, 
       R.drawable.final_0106, 
       R.drawable.final_0107, 
       R.drawable.final_0108, 
       R.drawable.final_0109, 
       R.drawable.final_0110, 
       R.drawable.final_0111, 
       R.drawable.final_0112, 
       R.drawable.final_0113, 
       R.drawable.final_0114, 
       R.drawable.final_0115, 
       R.drawable.final_0116, 
       R.drawable.final_0117, 
       R.drawable.final_0118, 
       R.drawable.final_0119, 
       R.drawable.final_0120 
     }; 

     private Bitmap mainBitmap; 
     private BitmapFactory.Options mBitmapOptions; 
     private int currentFrameIndex = 0; 

     WallpaperSerEngine() { 
      diwaliImg = new Runnable() { 
       public void run() { 
        drawFrame(); 
       } 
      }; 
      initMainBitmap(getResources(), pirates[0]); 
     } 

     private void initMainBitmap(Resources res,int resId){ 
      mBitmapOptions = new BitmapFactory.Options(); 
      mBitmapOptions.inJustDecodeBounds = true; 
      mBitmapOptions.inMutable = true; 
      BitmapFactory.decodeResource(res, resId,mBitmapOptions); 

      mainBitmap = Bitmap.createBitmap(mBitmapOptions.outWidth,mBitmapOptions.outHeight,Bitmap.Config.ARGB_8888); 
      mBitmapOptions.inJustDecodeBounds = false; 
      mBitmapOptions.inBitmap = mainBitmap;//will cause the bitmap to be reused. 
      mBitmapOptions.inSampleSize = 1; 
     } 

     public boolean setToFrame(int frameIndex){ 
      if(pirates != null && frameIndex >= 0 && frameIndex< pirates.length){ 
       currentFrameIndex = frameIndex; 
       mainBitmap = BitmapFactory.decodeResource(getResources(), pirates[currentFrameIndex], mBitmapOptions); 
       return true; 
      } 
      else return false; 
     } 


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

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

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

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

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

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


     @Override 
     public void onOffsetsChanged(float xOffset, float yOffset, float xStep,float yStep, int xPixels, int yPixels) { 
      drawFrame(); 
     } 

     @Override 
     public void onTouchEvent(MotionEvent event) { 
      super.onTouchEvent(event); 
     } 

     private void drawFrame() { 
      final SurfaceHolder holder = getSurfaceHolder(); 
      Canvas c = null; 
      try { 
       c = holder.lockCanvas(); 
       if (c != null) { 
        drawPirate(c); 
       } 
      } finally { 
       if (c != null) 
        holder.unlockCanvasAndPost(c); 
      } 
      mHandler.removeCallbacks(diwaliImg); 
      if (mVisible) { 
       mHandler.postDelayed(diwaliImg, 1000/24); 
      } 
     } 

     private void drawPirate(Canvas c) { 
      setToFrame(i); 
      i++; 
      if (i == 120) { 
       i = 0; 
      } 
      Matrix matrix = new Matrix(); 
      c.scale(mScaleX, mScaleY); 
      c.drawBitmap(mainBitmap, matrix, null); 
     } 
    } 
} 

ответ

1

в вызов BitmapFactory.decodeResource (getResources(), пираты [i]); создает новое растровое изображение. Я предполагаю, что ваши изображения имеют одинаковый размер, поэтому вы можете перерабатывать одно растровое изображение вместо создания нового при каждом изменении изображения. это должно дать вам значительный импульс для вашего FPS.

переработать растровый:

private Bitmap mainBitmap; 
private BitmapFactory.Options mBitmapOptions; 
private void initMainBitmap(Resources res,int resId){ 
    mBitmapOptions = new BitmapFactory.Options(); 
    mBitmapOptions.inJustDecodeBounds = true; 
    BitmapFactory.decodeResource(res, resId,mBitmapOptions); 

    mainBitmap = Bitmap.createBitmap(mBitmapOptions.outWidth,mBitmapOptions.outHeight,Bitmap.Config.ARGB_8888); 
    mBitmapOptions.inJustDecodeBounds = false; 
    mBitmapOptions.inBitmap = mainBitmap;//will cause the bitmap to be reused. 
    mBitmapOptions.inSampleSize = 1; 
} 

private int currentFrameIndex = 0; 
public boolean setToFrame(int frameIndex){ 
    if(pirates != null && frameIndex >= 0 && frameIndex< pirates.length){ 
     currentFrameIndex = frameIndex; 
     mainBitmap = BitmapFactory.decodeResource(mResources, pirates[currentFrameIndex],mBitmapOptions);   
     return true; 
    } 
    else return false; 
} 

использовать этот код:

вызова функцию initMainBitmap из вашего конструктора двигателя:

WallpaperSerEngine() { 
    diwaliImg = new Runnable() { 
     public void run() { 
      drawFrame(); 
     } 
    };   
    initMainBitmap(getResources(),pirates[0]); 
} 

вашего drawPirate должны изменить это:

private void drawPirate(Canvas c) { 
     setToFrame(i); 
     i++; 
     if (i == 120) { 
      i = 0; 
     } 
     Matrix matrix = new Matrix(); 
     c.scale(mScaleX, mScaleY); 
     c.drawBitmap(mainBitmap, matrix, null); 
} 
+0

Спасибо f или ваш ответ, не могли бы вы показать пример того, как использовать эти методы, потому что я не понимаю, как подключить их к моему проекту. Благодаря! – dajver

+1

Я изменил код, чтобы быть ближе к вашей реализации. так понятно? – chipopo

+0

Это привет! Спасибо за помощь!!! – dajver