Android - Поверхность недействительна

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

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);
            }
        }
    }
}

Существуют индикаторы, когда вызываются методы выполнения и рисования, но индикатор после проверки того, является ли экран действительным, не отображается

1 ответ

Решение

Реализуйте 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) {}

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