【问题标题】:Nothing Shows Up on Canvas from SurfaceHolder . lockCanvas() [Android]SurfaceHolder 的 Canvas 上没有显示任何内容。 lockCanvas() [安卓]
【发布时间】:2017-11-22 04:09:32
【问题描述】:

我正在尝试在从表面支架的 .lockCanvas() 函数返回的画布上绘图,但渲染的画布只是白色。

我的MySurface extends SurfaceViewimplements SurfaceHolder 构造函数:

MySurface(Context context){
            super(context);
            surfaceHolder = getHolder();
            surfaceHolder.addCallback(this);
            displayThread = new MyDisplayThread(surfaceHolder);
        }

我的surfaceCreated() 覆盖

public void surfaceCreated(SurfaceHolder sH){
            displayThread.start();
        }

我的surfaceDestroyed() 覆盖

public void surfaceDestroyed(SurfaceHolder sH){
            boolean reset = true;
            while(reset){
                try{
                    displayThread.join();
                    reset = false;
                }catch (InterruptedException e){}
            }
        }

以及我用于绘图的线程: 类变量是:

SurfaceHolder surfaceHolder,
Paint paint,
boolean isRunning,
Canvas canvas = null


 class MyDisplayThread extends Thread {

        MyDisplayThread(SurfaceHolder sH){
            surfaceHolder = sH;
            isRunning = true;
            paint = new Paint();
        }

        @Override
        public void run(){
            while(isRunning){
                canvas = surfaceHolder.lockCanvas();
                try{
                    myDraw();
                }finally {
                    if(canvas != null) surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }

        public void myDraw(){
            paint.setARGB(255,152,54,12);
            canvas.drawText("RSFDS",100,100,paint);
            canvas.drawRect(120,150,300,300,paint);
            paint.setARGB(255,255,255,255);
        }
    }

【问题讨论】:

    标签: java android canvas surfaceview surfaceholder


    【解决方案1】:

    尝试以下方法(这些方法过去对我有用):

    setWillNotDraw(false); 放入surfaceCreated

    在绘制每一帧之前,在 SurfaceHolder 对象上调用 postInvalidate();

    【讨论】:

      【解决方案2】:

      在调用surfaceCreated() 后,您需要再次调用getHolder()。这应该可以解决您的问题。

      @Override
      public void surfaceCreated(SurfaceHolder holder) {
          surfaceHolder = getHolder();
      }
      

      【讨论】:

        猜你喜欢
        • 2016-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        • 2014-07-21
        • 2016-02-19
        • 2020-06-16
        相关资源
        最近更新 更多