Настройка нескольких действий, каждое из которых содержит GLSurfaceView в TabHost

Моя настройка выглядит следующим образом: у TabHost есть два дочерних действия, каждое с одним GLSurfaceView в качестве содержимого. Две Activity, конечно же, пересылают свои события onPause() и onResume() в свои GLSurfaceViews.

Первое действие работает, как и ожидалось, однако переключение на другую вкладку не имеет визуального эффекта. LogCat показывает, что и onSurfaceCreated(), и onSurfaceChanged(), и onSurfaceDraw() вызываются, как и ожидалось, в обоих экземплярах GLSurfaceView.

«Исправление» состоит в том, чтобы установить видимость каждого GLSurfaceView с помощью setVisibility(View.INVISIBLE/VISIBLE) в onPause() и onResume() соответственно. Это приводит к отображению правильных представлений, но имеет обратную сторону, вызывая эффект мерцания при смене вкладки. Это особенно очевидно, когда GLSurfaceView делает больше работы.

По сути, как мне избежать необходимости устанавливать ВИДИМОСТЬ GLSurfaceViews?

Вкладка Активность:

    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mainactivity);

      TabHost tabHost = getTabHost();
      TabHost.TabSpec spec;
      Intent intent;

      // First Vortex view
      intent = new Intent().setClass(this, VortexActivity.class);
      spec = tabHost.newTabSpec("A")
            .setIndicator("A")
            .setContent(intent);
      tabHost.addTab(spec);

      // Second Vortex view
      intent = new Intent().setClass(this, VortexActivity.class);
      spec = tabHost.newTabSpec("B")
            .setIndicator("B")
            .setContent(intent);
      tabHost.addTab(spec);
}

Деятельность ребенка:

    public class VortexActivity extends Activity {

        private GLSurfaceView view;

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

      @Override
      public void onResume() {
        super.onResume();
        view.onResume();
        //view.setVisibility(View.VISIBLE);
      }

      @Override
      public void onPause() {
        super.onPause();
        view.onPause();
        //view.setVisibility(View.INVISIBLE);
      }

    }

Рендерер:

    public class VortexRenderer implements GLSurfaceView.Renderer {
        public void onSurfaceCreated(GL10 glArgument, EGLConfig config) {
        }
        public void onSurfaceChanged(GL10 gl, int w, int h) {
        }
        public void onDrawFrame(GL10 gl) {
            long ms = System.currentTimeMillis() % 2000;
            if(ms > 1000)
                ms = 1000 - (ms - 1000);
            float intensity = ms / 500.0f;
            gl.glClearColor(intensity, intensity, intensity, 1.0f);
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        }
    }

Макет:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="0dp" >

    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:padding="0dp" />

    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:padding="0dp" />
</LinearLayout>


person Rodskjegg    schedule 15.05.2012    source источник


Ответы (1)


Еще одно исправление состоит в том, чтобы иметь один всегда видимый GLSurfaceView и переключать отображаемый контент.

person Lawrence D'Oliveiro    schedule 16.05.2012
comment
Как бы вы разделили GLSurfaceView между действиями? Насколько я знаю, вам не разрешено «изменять» родительскую активность в представлении (stackoverflow.com/questions/7813306/) - person Rodskjegg; 16.05.2012
comment
Ах, достаточно справедливо. Я думал, что это просто дочерние макеты, а не настоящие действия. - person Lawrence D'Oliveiro; 18.05.2012