Понимание SurfaceView с и без SurfaceHolder.Callback - PullRequest
0 голосов
/ 21 октября 2018

Я экспериментирую с SurfaceView и создаю с ним простые анимации, я не понимаю, почему моя анимация (меняет цвет экрана с черного на белый) работает здесь (без использования SurfaceHolder.Callback)

public class MySurface extends SurfaceView {
   private boolean playing = true;
   private int counter = 0;

   public MySurface(Context context){
       super(context);
       new Anim().start();
   }

   private class Anim extends Thread {
       @Override
       public void run() {
           while (playing) {
               try {
                   sleep(1000);
                   draw();
                   counter++;
               } catch (Exception e){
                   e.printStackTrace();
               }
           }
          }

       private void draw() {
           SurfaceHolder holder = getHolder();
           Canvas canvas = holder.lockCanvas();
           if (canvas != null) {
               if (counter % 2 == 0) {
                   canvas.drawColor(Color.WHITE);
               } else
                   canvas.drawColor(Color.BLACK);
               holder.unlockCanvasAndPost(canvas);
           }
       }
   }
}

Но это не работает, какая разница?Я думаю, что это может быть вызвано вызовом .run () вместо .start ()

public class MySurface extends SurfaceView implements SurfaceHolder.Callback {
   Anim anim;
   private boolean playing = true;
   private int counter = 0;

   public MySurface(Context context){
       super(context);
   }
   // all Callbacks are overrided i didn add them to make code easier to read
   @Override
   public void surfaceCreated(SurfaceHolder surfaceHolder) {
       anim = new Anim();
       anim.run();
   } 


   private class Anim extends Thread {
       @Override
       public void run() {
           while (playing) {
               try {
                   sleep(1000);
                   draw();
                   counter++;
               } catch (Exception e){
                   e.printStackTrace();
               }
           }
       }

       private void draw() {
           SurfaceHolder holder = getHolder();
           Canvas canvas = holder.lockCanvas();
           if (canvas != null) {
                if (counter % 2 == 0) {
                    canvas.drawColor(Color.WHITE);
               } else
                   canvas.drawColor(Color.BLACK);
               holder.unlockCanvasAndPost(canvas);
           }
       }
    }
}

РЕДАКТИРОВАТЬ: я забыл добавить getHolder () .addCallback (this) , который вызвал проблему.

Может ли кто-нибудь еще указать на различия между этими двумя методами и сказать, какой из них лучше?

EDIT2: anim.start () также был необходим

...