在android 4.3中恢复下溢

时间:2013-08-13 22:10:27

标签: android

我收到 IllegalStateException:恢复异常中的下溢,,这导致我的应用程序崩溃。 这在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. 如何解决此错误?
  3. 生成的堆栈跟踪消息是。第165行对应第二个canvas.restore()

      

    08-13 18:13:09.083:E / AndroidRuntime(14139):致命异常:   Thread-506 08-13 18:13:09.083:E / AndroidRuntime(14139):   java.lang.IllegalStateException:恢复08-13中的下溢   18:13:09.083:E / AndroidRuntime(14139):at   android.graphics.Canvas.restore(Native Method)08-13 18:13:09.083:   E / AndroidRuntime(14139):at   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)

2 个答案:

答案 0 :(得分: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()来电即可。

答案 1 :(得分:2)

public void restore()

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