Note that there are some explanatory texts on larger screens.

plurals
  1. POLive Wallpaper OutOfMemory Error when i have more than 30 frames
    primarykey
    data
    text
    <p>I've been trying to make a simple live wallpaper out of a boot animation. So basically i have about 50 .pngs in my drawable folder. I'm able to set the animation to about 10-20 frames and it works great. But once i set it to about 30 frames...I get an OutOfMemory Error. I was hoping maybe someone could take a look at my code and maybe give an example of how I could achieve more frames? That would help so much i've been looking at this for hours > &lt;</p> <p>Here's my code:</p> <pre><code>package com.androidnetwork.animlivewp; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.os.Handler; import android.os.SystemClock; import android.service.wallpaper.WallpaperService; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; public class AnimatedLiveWallpaper extends WallpaperService { 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 final Paint mPaint = new Paint(); private float mPosY; private boolean mAnime = true; private Matrix mMatrix = new Matrix(); private final Runnable mDrawAnim = new Runnable() { public void run() { drawFrame(); } }; private boolean mVisible; private static final int NUM_RES = 30; private final Bitmap[] mPics = new Bitmap[NUM_RES]; CubeEngine() { Resources res = getResources(); for (int i = 0; i&lt; NUM_RES; i++) { int id = res.getIdentifier("boot_00" + (100 + (i + 1)), "drawable", "com.androidnetwork.animlivewp"); mPics[i] = 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 = mPics[0].getWidth(); float h = mPics[0].getHeight(); float s = width / (float)w; mMatrix.reset(); mMatrix.setScale(s, s); mPosY = (height - (h * s)) / 2f; drawFrame(); } @Override public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); } @Override public void onSurfaceDestroyed(SurfaceHolder holder) { super.onSurfaceDestroyed(holder); mVisible = false; mHandler.removeCallbacks(mDrawAnim); } @Override public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) { drawFrame(); } @Override public void onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_MOVE) { mAnime = !mAnime; } super.onTouchEvent(event); } void drawFrame() { final SurfaceHolder holder = getSurfaceHolder(); Canvas c = null; try { c = holder.lockCanvas(); if (c != null) { // draw something drawAnim(c); //drawTouchPoint(c); } } finally { if (c != null) holder.unlockCanvasAndPost(c); } // Reschedule the next redraw mHandler.removeCallbacks(mDrawAnim); if (mVisible &amp;&amp; mAnime) { mHandler.postDelayed(mDrawAnim, 1000 / 10); } } private int idx = 0; void drawAnim(Canvas c) { c.save(); c.translate(0, mPosY); c.drawBitmap(mPics[idx], mMatrix, mPaint); if (mAnime) ++idx; if (idx == NUM_RES) idx = 0; c.restore(); } } } </code></pre> <p>And here's a logcat if that'll help at all:</p> <pre><code>08-22 19:45:05.508: ERROR/AndroidRuntime(12277): FATAL EXCEPTION: main 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at android.graphics.Bitmap.nativeCreate(Native Method) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at android.graphics.Bitmap.createBitmap(Bitmap.java:468) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at android.graphics.Bitmap.createBitmap(Bitmap.java:435) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:346) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:372) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at com.androidnetwork.animlivewp.AnimatedLiveWallpaper$CubeEngine.&lt;init&gt;(AnimatedLiveWallpaper.java:55) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at com.androidnetwork.animlivewp.AnimatedLiveWallpaper.onCreateEngine(AnimatedLiveWallpaper.java:32) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper.executeMessage(WallpaperService.java:814) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:61) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at android.os.Handler.dispatchMessage(Handler.java:99) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at android.os.Looper.loop(Looper.java:123) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at android.app.ActivityThread.main(ActivityThread.java:4627) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at java.lang.reflect.Method.invokeNative(Native Method) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at java.lang.reflect.Method.invoke(Method.java:521) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 08-22 19:45:05.508: ERROR/AndroidRuntime(12277): at dalvik.system.NativeStart.main(Native Method) </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload