Android OpenGL расширяет исключения нулевого указателя GLSurfaceView - PullRequest
5 голосов
/ 31 июля 2010

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

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

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

EDIT: Я добился определенного прогресса, пытаясь заставить это работать ... в примере 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, не генерируя исключения NullPointerException для surfaceCreated и surfaceChanged, или как их отладить, не имея источника для GLSurfaceView.java?

1 Ответ

1 голос
/ 01 августа 2010

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

в 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, что я и хотел в первую очередь.

Ура!

...