Как "обменять" рендерер в экземпляре GLSurfaceView в android?

В android я взял пример вращающейся сферы, приведенный здесь . Он создает простое приложение, показывающее вращающуюся сферу (землю).

Теперь в классе, производном от GLSurfaceViewI, ждите четного (например, события сенсорного экрана), чтобы обменять рендерер. Я хочу, чтобы текущий рендерер прекратил рендеринг, и GLSurfaceViewдолжен использовать другой рендер вместо этого (для отображения какого-то другого объекта).

Я попытался использовать следующий код:

public class MyGLSurfaceView extends GLSurfaceView {

    Context mycontext;

    MyGLSurfaceView(Context context) {
        super(context);
        mycontext = context;
    }

    public boolean onTouchEvent(MotionEvent event) {
        int x = (int)event.getX();
        int y = (int)event.getY();
        Log.d("onTouchEvent",String.format("keyCode: %d  coords: %d  %d", event.getActionMasked(), x, y));

        GlRenderer renderer = new GlRenderer(mycontext);
        setRenderer(renderer);
        return super.onTouchEvent(event);
    }
}

который дает следующую ошибку:

FATAL EXCEPTION: main
Process: com.jimscosmos.opengltexturedsphere, PID: 25708
java.lang.IllegalStateException: setRenderer has already been called for this instance.

Я думаю, что я должен остановить/удалить / уничтожить «старый» рендерер, но я не нашел ничего полезного для этого в документации . Может быть, мой подход совершенно неправильный? Что еще делать? Как это сделать правильно?

1 ответ

  1. Если вы настаиваете, технически это может быть достигнуто с помощью «медиатора» — как предлагается здесь: изменить визуализатор GlSurfaceView .

    Однако-я думаю, что это накладные расходы, которые вам действительно не нужны. Просто подготовьте различные объекты и измените различные свойства рендеринга в одном рендере.