holder.lockCanvas (грязный) игнорирует грязный прямоугольник и др aws по всему экрану - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть класс, расширяющий SurfaceView, я передаю держатель "this.getHolder ()" ранее живому и работающему потоку. у этого потока есть все oop, в этом l oop я хочу один раз нарисовать фон и другие растровые изображения поверх этого фона:

   public void run() {
    try {
        Paint p = new Paint();
        p.setColor(Color.MAGENTA);
        p.setStyle(Paint.Style.FILL);
        Rect dty = null;
        int i = 0;

        while(!Thread.currentThread().isInterrupted()) {
            if(Loader.getInstance().isPlaying()) {

                // GAME LOOP HERE

                // only performs drawing operations while surface is not destroying
                synchronized (Loader.getInstance().getHolder()) {
                    if(Loader.getInstance().getHolder() != null) {

                        if(!Loader.getInstance().isBgDrawn()) {
                            dty = null;
                            c = Loader.getInstance().getHolder().lockCanvas(dty);
                            if(c != null) {
                                c.drawRGB(100,0,0);
                                Loader.getInstance().setBgDrawn(true);
                                Loader.getInstance().getHolder().unlockCanvasAndPost(c);
                            }
                        }
                        else {
                            dty = new Rect(0,0,200,200);
                            if(dty!=null) c = Loader.getInstance().getHolder().lockCanvas(dty);
                            if(c != null) {
                                if(dty!=null)c.drawRGB(0,0,100);
                                Loader.getInstance().getHolder().unlockCanvasAndPost(c);
                            }
                        }
                    }
                }
            }
            Thread.sleep(1000);
        }
        throw new InterruptedException();
    } catch (InterruptedException ie) {
        // CLEAN THIS RUNNABLE HERE
        Log.println(Log.ASSERT, TAG, "run: CLEANING GAME RUNNABLE");
    }
}

Но, когда нет фона (bgDrawn === true), holder.lockCanvas (dty) игнорирует эти dty и dr aws по всей поверхности.

правильно ли я применяю грязный прямоугольник внутри lockCanvas (dty)? Просто хочу нарисовать один раз фон, а затем мелочи над этим фоном, и все это в отдельном потоке.

...