首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android: Surface已经发布

Android: Surface已经发布
EN

Stack Overflow用户
提问于 2017-08-14 13:30:00
回答 2查看 2.6K关注 0票数 2

因此,这段代码似乎就是问题所在:

代码语言:javascript
复制
public void surfaceCreated(final SurfaceHolder sh) {
    loop = new Loop();
    loop.setMethod(new LoopMethod() {
        public void callMethod() {
            Canvas canvas = sh.lockCanvas();
            synchronized(sh) {
                draw(canvas);
            }
            sh.unlockCanvasAndPost(canvas);
        }
    });
    loop.setRunning(true);
    loop.start();
}

这可以正常工作,直到用户退出应用程序,或者打开最近的项目托盘。在此,我得到以下错误:

代码语言:javascript
复制
java.lang.IllegalStateException: Surface has already been released.

它指向这一行:

代码语言:javascript
复制
 sh.unlockCanvasAndPost(canvas);

为什么会发生这种情况,我该如何解决呢?

编辑:整个有问题的类

代码语言:javascript
复制
public class SplashScreen extends SurfaceView implements SurfaceHolder.Callback {
    private SplashActivity splashActivity;
    private Loop loop;

    //Loading gif info
    private Movie loadingGif;
    private long gifStart;
    private int gifW, gifH;
    private boolean gifDone;

    public SplashScreen(Context context, SplashActivity splashActivity) {
        super(context);
        getHolder().addCallback(this);

        this.splashActivity = splashActivity;

        //Load gif in
        InputStream gifStream = context.getResources().openRawResource(+ R.drawable.load);
        loadingGif = Movie.decodeStream(gifStream);
        gifW = loadingGif.width();
        gifH = loadingGif.height();
        gifDone = false;
    }

    private void beginLoading() {

    }

    public void surfaceCreated(final SurfaceHolder sh) {
        loop = new Loop();
        loop.setMethod(new LoopMethod() {
            public void callMethod() {
                Canvas canvas = sh.lockCanvas();
                synchronized(sh) {
                    draw(canvas);
                }
                sh.unlockCanvasAndPost(canvas);
            }
        });
        loop.setRunning(true);
        loop.start();
    }

    public void draw(Canvas canvas) {
        if(canvas != null) {
            super.draw(canvas);
            canvas.save();

            canvas.drawColor(Color.rgb(69, 69, 69));
            Paint p = new Paint();
            p.setAntiAlias(true);

            long now = android.os.SystemClock.uptimeMillis();
            if(gifStart == 0)
                gifStart = now;
            if(loadingGif != null) {
                int dur = loadingGif.duration();
                if(!gifDone) {
                    int relTime = (int) ((now - gifStart) % dur);
                    loadingGif.setTime(relTime);
                }
                else
                    loadingGif.setTime(dur);

                if(now - gifStart > dur && !gifDone) {
                    gifDone = true;
                    loadingGif.setTime(dur);
                    beginLoading();
                }

                float scaleX = getWidth()/gifW*1f;
                float scaleY = getHeight()/gifH*1f;
                float centerX = getWidth()/2/scaleX - gifW/2;
                float centerY = getHeight()/2/scaleY - gifH/2;

                canvas.scale(scaleX, scaleY);
                loadingGif.draw(canvas, centerX, centerY, p);
                canvas.restore();

                p.setColor(Color.WHITE);
                p.setTypeface(Typeface.create("Segoe UI", Typeface.BOLD));
                p.setTextSize(UsefulMethods.spToPx(12));
                String s = "Version " + BuildConfig.VERSION_NAME;
                canvas.drawText(s, 10, getHeight() - 10, p);
            }
        }
        else
            System.out.println("not drawing :(");
    }

    public void surfaceDestroyed(SurfaceHolder sh) {
        loop.setRunning(false);
    }
    public void surfaceChanged(SurfaceHolder sh, int format, int width, int height) {
        System.out.println("call");
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-14 14:08:53

检查可见性是否已更改,是否有暂停/恢复循环:

代码语言:javascript
复制
public void onVisibilityChanged(View view, int visibility) {
    super.onVisibilityChanged(view, visibility);
    if(loop != null)
        if(visibility == VISIBLE)
            if(!loop.isRunning())
                loop.setRunning(true);
            else;
        else if(visibility == INVISIBLE)
            if(loop.isRunning())
                loop.setRunning(false);
}
票数 2
EN

Stack Overflow用户

发布于 2022-08-29 14:15:00

在我的案例中,我用

代码语言:javascript
复制
if(sh.getSurface().isValid()){
    sh.unlockCanvasAndPost(canvas);
}

如果我们检查isValid()源,我们会看到:

如果此对象持有有效曲面,则返回true。@如果它持有一个物理面,则返回True,因此lockCanvas()将succeed.Otherwise返回false。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45675687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档