Попытка запустить рендерер из GLSurfaceView, объявленного в макете - PullRequest
0 голосов
/ 19 декабря 2011

Я новичок в OpenGL на Android, и на прошлой неделе я описал проблему, из-за которой не удалось запустить средство визуализации для GLSurfaceView, объявленного в макете. Все начинается нормально, если я объявляю рендерер в классе Activity и устанавливаю ему ConContentView. Вот упрощенная версия с all исходным кодом. Что я делаю не так?

Макет . , ,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <Button
    android:id="@+id/dummy"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="a Button" />
  <FrameLayout
  android:id="@+id/framelay"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
     <com.test.rendertest.RTSurface
     android:id="@+id/RTSurfaceView"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"/>
  </FrameLayout>  
</LinearLayout>

Занятие . Раскомментируйте // A и закомментируйте // B , и рендерер запустится. Но, как показано ниже, средство визуализации не запускается, даже если вызывается его конструктор.

public class RenderTest extends Activity {

       RTSurface myView;
       @Override
       public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
//        myView = new RTSurface(this);   // A
//        setContentView(myView);         //A
          setContentView(R.layout.main);        // B
          myView = (com.test.rendertest.RTSurface)findViewById(R.id.RTSurfaceView);  //B
       }

       @Override
       protected void onPause() {
           super.onPause();
           myView.onPause();
       }

       @Override
       protected void onResume() {
           super.onResume();
           myView.onResume();
       }       
}

GLSurfaceView . , ,

class RTSurface extends GLSurfaceView  {
   private final RTRenderer renderer;

   public RTSurface(Context context) {
      super(context);
      Log.i("rendertest", "RTSurface constructor - Default Form");
      renderer = new RTRenderer();
      setRenderer(renderer);
   }

   public RTSurface(Context context, AttributeSet attrs) {
      super(context, attrs);    
      Log.i("rendertest", "RTSurface constructor - Layout Form");
      renderer = new RTRenderer();
      setRenderer(renderer);
   }  
}

. , , и Renderer (только заглушки)

class RTRenderer implements GLSurfaceView.Renderer {

   public RTRenderer () {
       // a constructor just to have somewhere to set 
       // breakpoints and logcat messages
       Log.i("rendertest", "RTRenderer Constructor");      
   }

   public void onSurfaceCreated(GL10 gl, EGLConfig config) {               
      Log.i("rendertest", "onSurfaceCreated in RTRenderer");                   
   }

   public void onSurfaceChanged(GL10 gl, int width, int height) {
      Log.i("rendertest", "onSurfaceChanged in RTRenderer");                
   } 

   public void onDrawFrame(GL10 gl) {   
       Log.i("rendertest", "onDrawFrame in RTRenderer");     
     }  
} 

Спасибо заранее !!

1 Ответ

2 голосов
/ 19 декабря 2011

Вы не указали ориентацию LinearLayout, поэтому по умолчанию она установлена ​​на horizontal. Это означает, что ваш GLSurfaceView находится за пределами экрана (поскольку вы установили ширину кнопки на fill_parent).

Просто добавьте следующий атрибут в свой LinearLayout:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...