我正在尝试为Android创建一个简单的3-D应用程序,该应用程序将在OpenGL View 之上分层放置一个附加 View (非常类似于API演示中的SurfaceViewOverlay示例)。我在尝试使用扩展的GLSurfaceView类实现该方法时遇到问题。我已经建立了一个示例,试图将this demo与API Oerlay演示结合起来。如果我尝试像这样转换为Martin的VortexView对象(请替换API演示中的第44-46行)

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

我收到ClassCastException错误(这是可以理解的,因为我认为转换是相当具体的),所以我想我正在寻找一种方法,将 View 从GLSurfaceView实例传输到新的子类,或者将渲染表面设置为创建子类后,XML定义的 View 。

编辑:
为了使它起作用,我取得了一些进展-
在API示例中, View 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
它将使用上面的代码正确地进行强制转换,但是在GLSurfaceView类内部命中surfaceCreated和surfaceChanged例程(我认为这是基于行号的GLThread类中的被调用方法)时,会生成Null Pointer Exceptions。所以也许我应该改变这个问题
如何在不对surfaceCreated和surfaceChanged生成NullPointerExceptions的情况下实现GLSurfaceView的扩展,或者如何在没有GLSurfaceView.java的源代码的情况下调试它们?

最佳答案

这是我如何使其工作的方法:

在XML文件中(我的是main.xml)使用扩展的类规范

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

在您的 Activity 课中:
    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

View 定义(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调用。

无论如何,这似乎使我可以在扩展的GLSurface上堆叠其他XML定义的 View ,这是我最初想要的。

干杯!

关于Android OpenGL扩展GLSurfaceView空指针异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3376322/

10-11 00:15