Ничего не появляется на холсте из SurfaceHolder . lockCanvas() [Android]

Я пытаюсь нарисовать на холсте, который возвращается с поверхности держателя.lockCanvas() функция, но холст, который отображается, просто белый.

мой MySurface extends SurfaceView а также implements 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);
        }
    }

2 ответа

Вам нужно позвонить getHolder() снова после surfaceCreated() называется. Это должно исправить вашу проблему.

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

Попробуйте следующее (это работало для меня в прошлом):

Положил setWillNotDraw(false); внутри поверхностиСоздано

Вызов postInvalidate(); на вашем объекте SurfaceHolder перед рисованием каждого кадра.

Другие вопросы по тегам