Использование класса GLSurfaceView с макетами Android xml

#java #android #android-layout #opengl-es #glsurfaceview

#java #Android #android-layout #opengl-es #glsurfaceview

Вопрос:

Я хочу использовать макеты Android xml. Я поместил GLSurfaceView в макет фрейма для использования в сочетании с линейным макетом, подобным этому…

 <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1">

<android.opengl.GLSurfaceView android:id="@ id/surfaceviewclass"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</FrameLayout>

<LinearLayout android:id="@ id/gamecontrolslayout"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:layout_weight="5"
          android:background="@drawable/backdrop"> 
//some layout stuff

</LinearLayout>
<LinearLayout>
  

Затем я вызываю свой макет следующим образом

 setContentView(R.layout.main);
    GLSurfaceView glSurfaceView = (GLSurfaceView)findViewById(R.id.surfaceviewclass);
  

в onCreate();

Как я могу вызвать свой GLSurfaceView, чтобы я мог использовать подобные XML-макеты, а также ссылаться на свой собственный класс GLSurfaceView (ниже приведен код, который ссылается на мой собственный класс GLSurfaceView)…

 glSurfaceView = new MyGLSurfaceView(this);
    setContentView(glSurfaceView);
  

Есть ли способ объединить эти два? Я хочу сделать это, потому что в моем классе GLSurfaceView происходит множество вещей, таких как загрузка файлов и события касания. И только я только что подумал о реализации этого нового макета

Ответ №1:

Просто ссылайтесь на свой собственный класс (с полным именем пакета) в xml, так же, как вы ссылаетесь на android.opengl.GLSurfaceView. Убедитесь, что ваш подкласс реализует правильный конструктор и передает контекст и атрибуты родительскому классу:

 public MyGLSurfaceView(Context context, AttributeSet attrs)
{
   super(context, attrs);
  

Затем вы можете извлечь его с помощью findViewById:

 MySurfaceView glSurfaceView = 
             (MySurfaceView)findViewById(R.id.surfaceviewclass);
  

Это должно сработать.

Комментарии:

1. В моем представлении Surface нет набора атрибутов, если это имеет значение?

2. Просто implementend выше сказано, что у него проблемы с раздуванием класса. Ошибка возникает из файла xml

3. public class MyGLSurfaceView extends GLSurfaceView { и конструктор public MyGLSurfaceView(Context context){ super(context);

4. Но теперь любые вызовы, которые я делаю для своего surface view (ie: glSurfaceView.requestRender ), перестали работать = (

5. Странно, что все это работает сейчас. Оказывается, вы делаете все, что сказали, за исключением того, что вам нужно получить GLSurfaceView с glSurfaceView = new MyGLSurfaceView(this); помощью, а затем установить XML-файл в качестве содержимого, насколько это раздражает. не могли бы вы обновить свой ответ, чтобы он соответствовал, пожалуйста.

Ответ №2:

Если все правильно, как вы пишете в xml-макете, полный путь к Glsurfaceview-class : (и classname)

это работает, только если класс GLSurfaceView записан в собственном файле. в этом файле для shure конструкторы должны быть написаны правильно.

я читал о, 1 конструкторе для xml-ссылки и один для связи между классами. конструктор для xml-ссылки и один для связи между классами можно найти, если он написан правильно, внутри GLSurfaceView . GLSurfaceView — это то место, где вы устанавливаете средство визуализации, устанавливаете его в конструкторе xml, должно быть единственным способом, он работает нормально. (показано на примере 1)

xml-конструктор:

public MyGLSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); setEGLContextClientVersion(2);
средство визуализации = новое средство визуализации (контекст); setRenderer(средство визуализации);

Если вы являетесь одним из этих людей, которые не могут заставить SurfaceView работать в xml-макете, которые покупают эту книгу у Apress — Начинайте разработку 3D-игр. не сердитесь и не причиняйте себе вреда. На странице 44-45 это должно быть записано в одном файле. Напишите GLSurfaceView, как в моем ответе, в собственном файле. Средство визуализации — это собственный файл, где: onSurfaceCreated, onSurfaceChanged, onDrawFrame .. можно найти и MainActivity

Комментарии:

1. если вы действительно изучаете gl es для Android, я бы купил распечатку из книги «Начало и … 3D» — Роберт Чин, к ней рядом с вашим столом, смотрите Новый бостен.