Android SurfaceHolder.unlockCanvasAndPost () не вызывает перерисовку - PullRequest
9 голосов
/ 29 сентября 2010

Я реализую довольно стандартное приложение с Android SDK, которое включает рисование с использованием SurfaceView, SurfaceHolder, настройки обратного вызова.

В моем основном потоке (поток пользовательского интерфейса) у меня нет рисования или обработки SurfaceHolder(или холст, который вы получаете с ним).

В отдельном потоке у меня есть следующее:

Log.i("GAME.DrawThread", "run()");
        Log.i("GAME.DrawThread", Thread.currentThread().getName());
        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas();
            synchronized(holder) {
                Log.i("GAME", "draw():synchronized");
                Paint paint = new Paint();
                paint.setColor(R.color.draw_color);
                canvas.drawColor(R.color.draw_color);
                canvas.drawLine(0, 0, 500, 500, paint);
            }
        } catch (SurfaceHolder.BadSurfaceTypeException e) {
            Log.e("GAME", "onDraw():  BadSurfaceTypeException");
        } finally {
            if (canvas != null) {
                holder.unlockCanvasAndPost(canvas);
            }
        } 

Этот код выполняется, не вызывает исключений и не имеет отрицательных побочных эффектов.что я могу найти;однако вызов unlockCanvasAndPost () никогда не приводит к вызову onDraw ().

Другими словами, unlockCanvasAndPost () не вызывает перерисовку SurfaceView.

Любые идеи, которые могут вызвать этосимптом?У меня большой опыт работы с Java, достаточно опыта работы с Android и большой опыт отладки, и я не могу его отследить.

Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 06 октября 2010

Получается, что при использовании SurfaceView вы рисуете на поверхность, которая находится под окном.Я устанавливал цвет фона представления в xml;получается, что задает цвет фона окна, а не поверхности.По сути, я сделал окно непрозрачным, чтобы вы не могли видеть поверхность под ней.

Извлеченный урок.

0 голосов
/ 20 марта 2011

Это старый, но у меня есть ощущение, что проблема в том, что нет обратного вызова поверхностного держателя. Он пытался нарисовать на поверхности, прежде чем поверхность была создана

0 голосов
/ 29 сентября 2010

Это не так, как работает SurfaceView.Вызов unlockCanvasAndPost () не вызывает onDraw (), в этом весь смысл использования SurfaceView.Поверхность SurfaceView находится в другом окне.

...