2015-06-20 10 views
0

Я пытаюсь нарисовать красный круг каждые 5 секунд. У меня есть метод draw и run, а метод run вызывает метод draw, который рисует круги. Однако, когда метод draw вызывается из метода run, поверхность недействительна, поэтому я ничего не могу рисовать, а экран черный. Как я могу сделать поверхность действительной, или, если не могу, как еще я могу это сделать? Вот код и logcat.Android - Поверхность не действительна

public class RandomCircles extends Activity { 

    MySurfaceView mySurfaceView; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mySurfaceView = new MySurfaceView(this); 
     setContentView(mySurfaceView); 
    } 


    @Override 
    protected void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume(); 
     mySurfaceView.onResumeMySurfaceView(); 
    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     mySurfaceView.onPauseMySurfaceView(); 
    } 

    class MySurfaceView extends SurfaceView implements Runnable { 

     Thread thread = null; 
     SurfaceHolder surfaceHolder; 
     volatile boolean running = false; 
     Handler handler = new Handler(); 

     private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     Random random; 

     public MySurfaceView(Context context) { 
      super(context); 
      // TODO Auto-generated constructor stub 
      surfaceHolder = getHolder(); 
      random = new Random(); 
     } 

     public void onResumeMySurfaceView() { 
      running = true; 
      thread = new Thread(this); 
      thread.start(); 
     } 

     public void onPauseMySurfaceView() { 
      boolean retry = true; 
      running = false; 
      while (retry) { 
       try { 
        thread.join(); 
        retry = false; 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 

     @Override 
     public void run() { 
      System.out.println("The run method is running"); 
      // TODO Auto-generated method stub 
      Draw(); 
     } 

     public void Draw() { 
      System.out.println("The draw method is running"); 
      if (surfaceHolder.getSurface().isValid()) { 
       System.out.println("The surface is valid"); 
       Canvas canvas = surfaceHolder.lockCanvas(); 
       //... actual drawing on canvas 

       int x = random.nextInt(getWidth()); 

       if (getWidth() - x < 100) 
        x -= 100; 
       else if (getWidth() - x > getWidth() - 100) 
        x += 100; 

       int y = random.nextInt(getHeight()); 

       if (getHeight() - y < 100) 
        y -= 100; 
       else if (getHeight() - x > getHeight() - 100) 
        y += 100; 

       int radius; 
       radius = 100; 
       Paint paint = new Paint(); 
       paint.setStyle(Paint.Style.FILL); 
       paint.setColor(Color.WHITE); 
       canvas.drawPaint(paint); 
       // Use Color.parseColor to define HTML colors 
       paint.setColor(Color.parseColor("#CD5C5C")); 
       canvas.drawCircle(x, y, radius, paint); 

       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
} 

There are indicators when the run and draw methods are called, but the indicator after the check for if the screen is valid does not display.

+0

The код для вызова метода рисования каждые 5 секунд не были добавлены еще вызвать эту часть еще не работает еще – Sygnerical

ответ

2

Реализовать SurfaceHolder.Callback и только оказывать на Surface когда вы получаете surfaceCreated(SurfaceHolder holder) обратного вызова. Например:

public MySurfaceView(Context context) { 
    super(context); 
    surfaceHolder = getHolder(); 
    surfaceHolder.addCallback(new SurfaceHolder.Callback() { 
       @Override 
       public void surfaceDestroyed(SurfaceHolder holder) { 
         //stop render thread here 
       } 

       @Override 
       public void surfaceCreated(SurfaceHolder holder) { 
         //start render thread here 
       } 
       @Override 
       public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} 

     }); 
} 
+0

Что именно будут делать эти методы и предложить? – Sygnerical

+0

Когда создание Поверхности закончено (поэтому оно будет действительным) вызывается 'surfaceCreated()', и вы можете начать рисовать на нем. Ссылка на ответ довольно самоисследовательная: «При использовании с SurfaceView удерживаемая поверхность доступна только между вызовами для поверхностейCreated() и surfaceDestroyed().' – MadEqua

+0

О, если я переведу код в методе рисования, чтобы поверхностный метод, он должен работать правильно? Но после того, как поверхность будет уничтожена, вы можете просмотреть, что вы нарисовали раньше? – Sygnerical