【问题标题】:Android OpenGL extending GLSurfaceView null pointer exceptionsAndroid OpenGL 扩展 GLSurfaceView 空指针异常
【发布时间】:2010-07-31 00:53:16
【问题描述】:

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

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" />

如果我将该元素更改为 a
com.domain.project.VortexView 它将使用上面的代码正确地进行转换,但是当它遇到 GLSurfaceView 类中的 surfaceCreated 和 surfaceChanged 例程(我认为它是基于行号的 GLThread 类中的调用方法)时会生成空指针异常。所以也许我应该换个问题—— 如何在不在 surfaceCreated 和 surfaceChanged 上生成 NullPointerExceptions 的情况下实现 GLSurfaceView 的扩展,或者如何在没有 GLSurfaceView.java 源的情况下调试它们?

【问题讨论】:

    标签: android 3d opengl-es views surfaceview


    【解决方案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 只有典型的 onSurfaceXXXXXX 调用。

    无论如何,这似乎允许我在我的扩展 GLSurface 上堆叠其他 XML 定义的视图,这是我最初想要的。

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多