9

我收到IllegalStateException: underflow in restore 异常,这导致我的应用程序崩溃。这在 android 4.3 更新后开始发生。在 android 3.0 - 4.2.x 上它工作正常。

异常发生在第二个

canvas.restore();

下面给出的是我的绘图代码

private void doDraw(Canvas canvas) {
        if(mTickerBackGround!=null && (!mTickerBackGround.isRecycled())){
            canvas.drawBitmap(mTickerBackGround, 0, 0, null);
        }
        if((mBitMapBuffer!=null)){
            canvas.save();
            canvas.translate(mX, 0);
            if(!mBitMapBuffer.isRecycled()){
                canvas.drawBitmap(mBitMapBuffer, 0, 0, null);
            }
            canvas.restore();

            if(bitMapWidth+mX<mCanvasWidth){
                canvas.translate(bitMapWidth+mX, 0);    
                if(!mBitMapBuffer.isRecycled()){
                    canvas.drawBitmap(mBitMapBuffer, 0, 0, null);
                }
                canvas.restore();                   
            }

            if(bitMapWidth+mX<=0){
                mX = 0;
            }else if(Math.abs(mX)>(bitMapWidth)){                   
                mX= mCanvasWidth; 
            }

            mX-=TickerConstants.SCROLLING_SMOOTHNESS*density;;
        }
        if(mLogo!=null && (!mLogo.isRecycled())){
            canvas.drawBitmap(mLogo, mCanvasWidth-(60*density), mLogo.getHeight()/6, null);
        }
    }

我的问题是

  1. 这个错误是什么意思?
  2. 我该如何解决这个错误?

生成的堆栈跟踪消息是 . 第 165 行对应于第二个 canvas.restore()

08-13 18:13:09.083:E/AndroidRuntime(14139):致命异常:线程 506 08-13 18:13:09.083:E/AndroidRuntime(14139):java.lang.IllegalStateException:恢复 08-13 中的下溢18:13:09.083: E/AndroidRuntime(14139): 在 android.graphics.Canvas.restore(Native Method) 08-13 18:13:09.083: E/AndroidRuntime(14139): 在 com.my.package.name。 ticker.TickerSurfaceView$TickerThread.doDraw(TickerSurfaceView.java:165) 08-13 18:13:09.083: E/AndroidRuntime(14139): at com.my.package.name.ticker.TickerSurfaceView$TickerThread.run(TickerSurfaceView.java :128)

4

2 回答 2

14

该错误位于代码的此部分中:

    if(bitMapWidth+mX<mCanvasWidth){
        canvas.translate(bitMapWidth+mX, 0);    
        if(!mBitMapBuffer.isRecycled()){
            canvas.drawBitmap(mBitMapBuffer, 0, 0, null);
        }
        canvas.restore();                   
    }

你没有先打电话restore()就打电话save()。您甚至都不需要调用translate(),只需将 x 和 y 坐标传递给drawBitmap()调用即可。

于 2013-08-13T22:22:51.097 回答
2

公共无效恢复()

在 API 级别 1 中添加此调用平衡了对 save() 的先前调用,并用于删除自上次保存调用以来对矩阵/剪辑状态的所有修改。调用 restore() 的次数多于调用 save() 的次数是错误的。

于 2015-01-29T19:54:23.623 回答