Android: возврат к основному действию из GLSurfaceView

Я не понимаю поток между моей основной деятельностью и средством визуализации OpenGL.

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

Я попытался вызвать setContentView(R.layout.activity_run) из GLRenderer, но, очевидно, это не сработало. Затем я попытался создать функцию Run.endRendering(), которая была статическим методом и вызывалась из GLRenderer. Run.endRendering() должен был вызвать setContentView(R.layout.activity_run) в надежде, что он затем перенесет представление обратно на главный экран, но поскольку R.endRendering() является статическим методом, он не может вызвать нестатический метод setContentView().

Так что теперь я совсем потерялся. Может ли кто-нибудь пролить свет на эту тему?

Это скелеты, которые у меня есть.

Основная деятельность:

public class Run extends Activity
{
    private GLSurfaceView glSurface;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_run);

        // in here I mess with the main layout view the user
        // is supposed to see. when he/she clicks on a button
        // he/she will be transferred to the opengl view

        // on button click:
        glSurface = new GLSurfaceView(this);
        glSurface.setRenderer(new GLRenderer());

        setContentView(glSurface);
    }
}

И рендерер:

public class GLRenderer implements Renderer
{
    // onSurfaceCreated, onDrawFrame, onSurfaceChanged, etc.

    // the action happens here. From here I want to return to
    // the main activity that created this renderer.
}

person Taika Jim    schedule 28.11.2012    source источник
comment
Используйте 2 действия, одно для вашего основного и одно для вашего Open GL.   -  person Carnal    schedule 28.11.2012


Ответы (1)


Одна вещь, которую вы можете сделать, это сделать ваш GLSurfaceView частью макета для этой активности. Поток пользовательского интерфейса действия продолжает работать. Создайте в нем обработчик, который позаботится об удалении GLSurfaceView из макета и отобразит ваши обычные не-opengl представления.

Handler mainHandler = new Handler() {
    public void handleMessage(Message msg) {
         // remove surfaceview from layout and show non-opengl views
    }
};

Затем вы можете передать ссылку на свою активность (возможно, используя интерфейс) в GLRenderer. Который может позвонить.

activity.mainHandler.sendMessage(msg)
person Slartibartfast    schedule 28.11.2012