9

IllegalStateException : underflow in restore 例外が発生し、アプリケーションがクラッシュします。これは、Android 4.3 のアップデート後に発生し始めました。Android 3.0 - 4.2.x では正常に動作します。

例外は2番目に発生します

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 行目は 2 番目の canvas.restore() に対応します。

08-13 18:13:09.083: E/AndroidRuntime(14139): FATAL EXCEPTION: Thread-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(ネイティブ メソッド) 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): 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() への以前の呼び出しのバランスを取り、最後の保存呼び出し以降のマトリックス/クリップ状態へのすべての変更を削除するために使用されます。save() が呼び出された回数よりも多く restore() を呼び出すと、エラーになります。

于 2015-01-29T19:54:23.623 に答える