【问题标题】:Live Wallpaper + bitmap + canvas动态壁纸+位图+画布
【发布时间】:2011-03-22 22:36:28
【问题描述】:

大家好!我在女巫中有这个动态壁纸,我尝试通过画布显示位图(可绘制资源是 400k 1900x1200 jpg)。它强制关闭,我不明白为什么(这是我的第一个 Android 项目)。这些是“重要”位:

    wallEngine() { // CONSTRUCTOR   <<<<<<<<<<<<<<<<<<<
                            mStartTime = SystemClock.elapsedRealtime();


                            Log.v(Logcat, "Contructor ok");

                        }
                //====================================== INIT
                        private final Runnable mDrawWall = new Runnable() { //=========== RUN
                            public void run() {
                                drawFrame();
                            }
                        };

   void drawFrame() {

                           final SurfaceHolder holder = getSurfaceHolder();                                         
                           Canvas c = null;
                           try {
                                c = holder.lockCanvas();
                                if (c != null) {
                                    // draw something
                                    updatePhysics();
                                    doDraw(c);
                                }
                            } finally {
                                if (c != null) holder.unlockCanvasAndPost(c);
                            }

                            // Reschedule the next redraw
                            mHandler.removeCallbacks(mDrawWall);
                            if (mVisible) {
                                mHandler.postDelayed(mDrawWall, 5000);
                            }
                        }


    private void doDraw(Canvas canvas) {                                                                                    
                      //backgroundImage.prepareToDraw();                                                    
                    canvas.drawBitmap(this.backgroundImage, 0, 0, null);                                                                    
                        }


public void onCreate(SurfaceHolder surfaceHolder) {

                            super.onCreate(surfaceHolder);                      surfaceHolder.setFormat(android.graphics.PixelFormat.RGBA_8888);        

                            BitmapFactory.Options options = new BitmapFactory.Options();
                            options.inPurgeable = true;

                            this.backgroundImage = BitmapFactory.decodeResource(getResources(), 
                                com.misca.livewallpapers.parang.R.drawable.a, options);

                            //backgroundImage.prepareToDraw();
                            //setTouchEventsEnabled(true);
                            Log.v(Logcat, "onCreate ok");
                        }

当我尝试在手机上运行它时出现的 logcat 错误是:

ERROR/AndroidRuntime(7722): FATAL EXCEPTION: main
ERROR/AndroidRuntime(7722): java.lang.NullPointerException
ERROR/AndroidRuntime(7722):     at android.graphics.Canvas.throwIfRecycled(Canvas.java:957)
ERROR/AndroidRuntime(7722):     at android.graphics.Canvas.drawBitmap(Canvas.java:983)
ERROR/AndroidRuntime(7722):     at com.misca.livewallpapers.parang.liveWallpaper$wallEngine.doDraw(liveWallpaper.java:115)
ERROR/AndroidRuntime(7722):     at com.misca.livewallpapers.parang.liveWallpaper$wallEngine.drawFrame(liveWallpaper.java:75)
ERROR/AndroidRuntime(7722):     at com.misca.livewallpapers.parang.liveWallpaper$wallEngine.onSurfaceChanged(liveWallpaper.java:157)
ERROR/AndroidRuntime(7722):     at android.service.wallpaper.WallpaperService$Engine.updateSurface(WallpaperService.java:590)
ERROR/AndroidRuntime(7722):     at android.service.wallpaper.WallpaperService$Engine.attach(WallpaperService.java:654)
ERROR/AndroidRuntime(7722):     at android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper.executeMessage(WallpaperService.java:878)
ERROR/AndroidRuntime(7722):     at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:61)
ERROR/AndroidRuntime(7722):     at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(7722):     at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(7722):     at android.app.ActivityThread.main(ActivityThread.java:3848)
ERROR/AndroidRuntime(7722):     at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(7722):     at java.lang.reflect.Method.invoke(Method.java:507)
ERROR/AndroidRuntime(7722):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
ERROR/AndroidRuntime(7722):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
03-23 00:26:42.309: ERROR/AndroidRuntime(7722):     at dalvik.system.NativeStart.main(Native Method)

谢谢! :)

======================== 新闻:

                        private void doDraw(Canvas canvas) {                                                                               
                        //backgroundImage.prepareToDraw();                         
                        if(this.backgroundImage!=null)
                        canvas.drawBitmap(this.backgroundImage, 0, 0, null);
                        else
                        Log.v(Logcat, "null");

                    }

而且似乎位图为空。现在我正在使用 480x800 以确保没有内存问题。应用程序不再因 if 语句而崩溃(黑屏)

【问题讨论】:

  • 在onCreate过程中实例化的backgroundImage成员是否保证不为空?如果是这样,似乎图像正在被回收,因此图像引用无效,因此出现 NullPointerException。
  • 你是对的!它是空的,谢谢。有没有更好的方式将其加载到位图中?

标签: android android-canvas


【解决方案1】:

您是否尝试过缩放位图以适合画布?在 onSurfaceChanged 中执行此操作,这样您就会知道要使用的宽度和高度。 您应该检查您的位图是否被正确解码。您的资源是 400K 并不重要——这是一个非常大的位图,可以尝试加载到内存中。你只有 16 兆的堆......那个位图大约是 9 兆(4 字节/像素 ARGB_8888)。乔治

【讨论】:

  • 我实际上已经在 onSurfaceCheanged 中完成了重新缩放,如下所示: backgroundImage = Bitmap.createScaledBitmap(backgroundImage, width, height, true); .如何测试位图加载?谢谢你:)
  • 位图似乎为空,那里没有加载!我错过了一些东西
  • @Misca 我将从缩放资源本身开始:制作一个更小的 jpeg。有一种方法可以在加载资源时对其进行扩展,但我忘记了它是如何完成的;如果我能找到它,我会留下另一条评论。我永远不会尝试将这么大的位图加载到内存中。
  • 现在我使用的是 800x480 jpg 并且仍然无法加载位图。我也试过 options.inDensity = 120;
  • @Misca 嗯。感觉好像有什么松鼠发生了。建议把事情分解,让它们一步一步地进行,以确保拼图的每一块都适合。下面是一些对我有用的代码: mContext = getApplicationContext(); mRes = mContext.getResources(); mBitmap = BitmapFactory.decodeResource(mRes, R.drawable.myimage, mOpts); (这样你可以确保你的资源是好的;不知道除了将文件转换为 png 之外还有什么建议)另外——你的位图应该是 480x800 而不是 800x480。
猜你喜欢
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多