gpt4 book ai didi

Android OpenGL 扩展 GLSurfaceView 空指针异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:07 25 4
gpt4 key购买 nike

我正在尝试为 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 类中的调用方法)时会生成空指针异常。所以也许我应该改变这个问题-如何在不在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com