Surfaceview + Glsurfaceview + Framelayout - PullRequest
9 голосов
/ 21 января 2010

Я новичок в Java и OpenGL.

Я пытаюсь получить экран предварительного просмотра камеры с возможностью отображать 3d объекты одновременно. Пройдя образцы в Демонстрацию API, я думал, комбинируя код для примеров в API демо будет достаточно. Но как-то не работает. Заставляет меня закрывать при запуске и ошибка упоминается как нулевой указатель исключение. Может кто-нибудь поделиться со мной, где я пошел не так и как исходить оттуда. Как я сделал комбинацию для кода, как показано ниже:

myoverview.xml


<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <android.opengl.GLSurfaceView 
            android:id="@+id/cubes" 
            android:orientation="horizontal" 
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent"/> 
    <SurfaceView 
            android:id="@+id/camera" 
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent"/> 
</FrameLayout>

myoverview.java


import android.app.Activity; 
import android.os.Bundle; 
import android.view.SurfaceView; 
import android.view.Window; 
public class MyOverView extends Activity { 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       // Hide the window title. 
       requestWindowFeature(Window.FEATURE_NO_TITLE); 
       // camera view as the background 
       SurfaceView cameraView = (SurfaceView) findViewById(R.id.camera); 
       cameraView = new CameraView(this); 
       // visual of both cubes 
       GLSurfaceView cubesView = (GLSurfaceView) findViewById(R.id.cubes); 
       cubesView = new GLSurfaceView(this); 
       cubesView.setRenderer(new CubeRenderer(false)); 
       // set view 
       setContentView(R.layout.myoverview); 
    } 
}

GLSurfaceView.java


import android.content.Context; 
class GLSurfaceView extends android.opengl.GLSurfaceView { 
    public GLSurfaceView(Context context) { 
            super(context); 
    } 
} 

ПРИМЕЧАНИЕ:

  • Я не перечислил остальные файлы, так как они являются просто копиями api demos. CameraView ссылается на пример camerapreview.java и CubeRenderer ссылается на CubeRenderer.java и Cube.java пример. Любая помощь будет оценена.

  • Извините, не понял, что кодирование было неуместным из-за ошибок форматирования.

Ответы [ 4 ]

4 голосов
/ 28 октября 2010

На самом деле это очень просто ... если вы хотите определить свое представление в XML, вам просто нужно реализовать

Public GLSurfaceView(Context context, AttributeSet attrs) {
...
super(context, attrs);
}

вместо GLSurfaceView (контекстный контекст)

Это тот, который вызывается автоматически при инициализации представления из XML. У меня была такая же проблема, и вот как она была исправлена.

4 голосов
/ 17 августа 2010

причина, по которой вы получаете исключение нулевого указателя при работе с .xml, заключается в том, что вы фактически создаете новые представления в своем коде Java ... вместо того, чтобы использовать те из файла .xml, которые вы могли передать в свойствах (если вы передали свойства, которые являются ..) .. новый Вид, очевидно, будет иметь нулевое значение .., таким образом, выбрасывая исключение нулевого указателя ... например -

cubesView = new GLSurfaceView (this);

на самом деле не требуется в коде, если вы уже создали представление в XML-файле, содержащем FrameLayout.

1 голос
/ 22 января 2010

Узнал, как решить эту проблему ... с помощью Java ... просто используйте addContentView вместо использования XML .... ну, по крайней мере, это решено. :)

0 голосов
/ 07 октября 2010

Я действительно сделал это здесь, в этой SO-ссылке , которая обеспечивает полную реализацию.

...