2

我想从MainActivity. (用户)项目的 Github 链接在文章末尾给出。

MainActivitydraw(Drawing)在 SurfaceView 实例上调用方法。

我有以下代码,只有在启用断点调试时才会绘制表面视图。

我已经访问了这些链接,没有找到解决方案:

Android SurfaceView 为空

使用 Surfaceview 绘图会创建空白屏幕

Android在surfaceview和canvas上绘图

我遵循的教程:

在 Android 画布上绘制三角形、菱形和其他自定义形状

Android 编码 - 在 SurfaceView 上绘图

我认为这是一个视图创建过程中的问题,所以我添加了创建检查:

public void draw(Drawing drawing) {    

        this.drawing = drawing;    

        if (surfaceHolder.isCreating()) {

            surfaceHolder.addCallback(new SurfaceHolder.Callback() {
                @Override
                public void surfaceCreated(SurfaceHolder holder) {   

                    thread = new Thread(LushSurfaceView.this);
                    thread.start();    
                }    

            });


        } else {


            thread = new Thread(this);
            thread.start();   

        }    
    }

这是线程:

 @Override
    public void run() {
        if (drawing != null) {


            switch (drawing) {


                case RECT:
                    drawRectShape();
                    break;
            }


        }
    }

我还故意添加了延迟以等待表面视图初始化。

private void drawRectShape() {

        if (surfaceHolder.getSurface().isValid()) {


            Canvas canvas = surfaceHolder.lockCanvas();
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            if (canvas != null && !surfaceHolder.isCreating()) {
                Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeWidth(30);


                Random random = new Random();

                int w = canvas.getWidth();
                int h = canvas.getHeight();
                int left = Math.round(w/2);
                int top = Math.round(h/2);
                int right = 200;
                int bottom =200;

                int r = random.nextInt(255);
                int g = random.nextInt(255);
                int b = random.nextInt(255);
                paint.setColor(0xff000000 + (r << 16) + (g << 8) + b);
                canvas.drawRect(new Rect(left, top, right, bottom), paint);

                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }

    }
  • 代码在以下情况下工作:我启用断点调试。
  • 简单的调试不显示任何绘制。
  • 我多次重新创建了这个场景。

我使用 Nexus 6 (OS 7.1.1) 作为测试设备。(不是模拟器)。

github 上的项目源。

4

0 回答 0