Android OpenGL, расширяющий исключения нулевого указателя GLSurfaceView

Я пытаюсь создать простое трехмерное приложение для Android, которое будет иметь дополнительный вид, наложенный поверх представления OpenGL (очень похоже на пример SurfaceViewOverlay в демонстрациях API). Я столкнулся с проблемой, пытаясь реализовать этот метод с помощью расширенного класса GLSurfaceView. Я создал пример, в котором пытаюсь выполнить комбинацию эта демонстрация с демонстрацией API Oerlay. Если я попытаюсь выполнить приведение к объекту VortexView Мартина, как это (замените строки 44-46 в демонстрации API)

VortexView glSurfaceView=
     (VortexView) findViewById(R.id.glsurfaceview);

Я получаю ошибку ClassCastException (что понятно, поскольку я предполагаю, что кастинг довольно специфичен), поэтому я думаю, что ищу метод для передачи представления из экземпляра GLSurfaceView в новый подкласс или способ установить поверхность рендеринга в Определенное представление XML для подкласса после его создания.

РЕДАКТИРОВАТЬ: я добился некоторого прогресса, пытаясь заставить это работать - в примере API представление XML использует (из ApiDemos/res/layout/surface_view_overlay.xml)

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

Если я изменю этот элемент на
com.domain.project.VortexView, он выполнит приведение правильно с помощью приведенного выше кода, но сгенерирует исключения нулевого указателя, когда попадет в подпрограммы surfaceCreated и surfaceChanged (я думаю, что это вызываемые методы в GLThread класс на основе номера строки) внутри класса GLSurfaceView. Так что, возможно, мне следует изменить вопрос: как я могу реализовать расширение для GLSurfaceView без создания исключений NullPointerExceptions для surfaceCreated и surfaceChanged, или как я могу отлаживать их, не имея исходного кода для GLSurfaceView.java?


person T. Markle    schedule 31.07.2010    source источник


Ответы (1)


Вот как я заставил это работать:

в файле XML (у меня это main.xml) используйте расширенную спецификацию класса

        <com.domain.project.VortexView android:id="@+id/vortexview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

В вашем классе активности:

    setContentView(R.layout.main);
    VortexRenderer _renderer=new VortexRenderer();         // setup our renderer
    VortexView glSurface=(VortexView) findViewById(R.id.vortexview); // use the xml to set the view
   glSurface.setRenderer(_renderer); // MUST BE RIGHT HERE, NOT in the class definition, not after any other calls (see GLSurfaceView.java for related notes)
   glSurface.showRenderer(_renderer); // allows us to access the renderer instance for touch events, etc

Определение вида (VortexView.java):

public class VortexView extends GLSurfaceView {
    public VortexRenderer _renderer; // just a placeholder for now

public VortexView(Context context) { // default constructor
    super(context);
}


public VortexView(Context context, AttributeSet attrs) { /*IMPORTANT - this is the constructor that is used when you send your view ID in the main activity */
    super(context, attrs);
}

public void showRenderer(VortexRenderer renderer){ // sets our local object to the one created in the main activity, a poor man's getRenderer
    this._renderer=renderer;        
}

public boolean onTouchEvent(final MotionEvent event) { // An example touchevent from the vortex demo
    queueEvent(new Runnable() {
        public void run() {
           _renderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);
        }
    });
    return true;
}

}

VortexRenderer.java просто имеет типичные вызовы onSurfaceXXXXX.

Во всяком случае, это, кажется, позволяет мне складывать другие представления, определенные XML, поверх моего расширенного GLSurface, чего я и хотел в первую очередь.

Ваше здоровье!

person T. Markle    schedule 31.07.2010