了解有无SurfaceHolder.Callback

时间:2018-10-21 19:27:54

标签: android surfaceview surfaceholder

我正在尝试使用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()

0 个答案:

没有答案