下溢在安卓4.3恢复 [英] underflow in restore in android 4.3

查看:97
本文介绍了下溢在安卓4.3恢复的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到的 IllegalStateException异常:下溢恢复异​​常,这是造成我的应用程序崩溃。 这开始的Andr​​oid 4.3更新后发生。在Android 3.0 - 4.2.x版能正常工作

在第二的异常情况

  canvas.restore();
 

下面给出我的绘图code

 私人无效doDraw(帆布油画){
        如果(mTickerBackGround = NULL和放大器;!&安培;!(mTickerBackGround.isRecycled())){
            canvas.drawBitmap(mTickerBackGround,0,0,NULL);
        }
        如果((mBitMapBuffer!= NULL)){
            canvas.save();
            canvas.translate(MX,0);
            如果(!mBitMapBuffer.isRecycled()){
                canvas.drawBitmap(mBitMapBuffer,0,0,NULL);
            }
            canvas.restore();

            如果(bitMapWidth + MX< mCanvasWidth){
                canvas.translate(bitMapWidth + MX,0);
                如果(!mBitMapBuffer.isRecycled()){
                    canvas.drawBitmap(mBitMapBuffer,0,0,NULL);
                }
                canvas.restore();
            }

            如果(bitMapWidth + MX&所述; = 0){
                MX = 0;
            }否则,如果(Math.abs(MX)>(bitMapWidth)){
                MX = mCanvasWidth;
            }

            MX-= TickerConstants.SCROLLING_SMOOTHNESS *密度;;
        }
        如果(mLogo = NULL和放大器;!&安培;!(mLogo.isRecycled())){
            canvas.drawBitmap(mLogo,mCanvasWidth-(60 *密度),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(本机方法)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)

解决方案

该错误是在本节的code:

 如果(bitMapWidth + MX< mCanvasWidth){
        canvas.translate(bitMapWidth + MX,0);
        如果(!mBitMapBuffer.isRecycled()){
            canvas.drawBitmap(mBitMapBuffer,0,0,NULL);
        }
        canvas.restore();
    }
 

正在调用恢复(),而无需调用保存()第一。你甚至不需要说调用翻译()或者,你可以只通过x和y坐标与 drawBitmap()电话。

I'm getting a IllegalStateException: underflow in restore exception, which is causing my application to crash. This started happening after android 4.3 update. On android 3.0 - 4.2.x it works fine.

The exception happens on the second

canvas.restore();

Given below is my drawing code

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);
        }
    }

My question is

  1. What is the meaning of this error?
  2. How do i fix this error?

Stack trace message generated is . Line 165 corresponds to second 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: Underflow in restore 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)

解决方案

The bug is in this section of your code:

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

You are calling restore() without calling save() first. You don't even need that call to translate() either, you could just pass the x and y coordinates to the drawBitmap() call.

这篇关于下溢在安卓4.3恢复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆