Surfaceview + Glsurfaceview + Framelayout
Я новичок в Java и OpenGL.
Я пытаюсь получить экран предварительного просмотра камеры с возможностью одновременного отображения трехмерных объектов. Изучив примеры в демоверсиях 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. CameraView ссылается на пример camerapreview.java, а CubeRenderer ссылается на пример CubeRenderer.java и Cube.java. Любая помощь будет оценена.
Извините, не понял, что кодирование было неуместным из-за ошибок форматирования.
4 ответа
Причина, по которой вы получаете исключение нулевого указателя при работе с.xml, заключается в том, что вы на самом деле создаете новые представления в своем коде Java... вместо того, чтобы использовать те из файла.xml, в который вы, возможно, передали свойства (если вы передали в свойствах то есть..).. новый Вид, очевидно, будет иметь нулевое значение.., таким образом, выбрасывая исключение нулевого указателя... например -
cubesView = новый GLSurfaceView(это);
на самом деле не требуется в коде, если вы уже создали представление в XML-файле, содержащем FrameLayout.
На самом деле это очень просто... если вы хотите определить свое представление в XML, вам просто нужно реализовать
Public GLSurfaceView(Context context, AttributeSet attrs) {
...
super(context, attrs);
}
вместо GLSurfaceView(контекстный контекст)
Это тот, который вызывается автоматически, когда представление инициализируется из XML. У меня была такая же проблема, и вот как она была исправлена.
Выяснил, как решить эту проблему... с помощью Java... просто используйте addContentView вместо использования XML.... ну, по крайней мере, это решено.:)
Я действительно сделал это здесь, в этой ссылке SO, которая обеспечивает полную реализацию.