提案された Google メソッドを使用して、XML でビューを実装してみませんか。2 つのカスタム surfaceview を作成します (私の場合、1 つは GLSurfaceView で、もう 1 つは SurfaceView でした)。1 つのビューはカメラを実装し、2 つ目のビューはグラフィックやボタンを使用して GUI を処理できます。重要なのは、拡張された SurfaceView と GLSurfaceView のクラス名を使用するカスタム GLSurfaceView と SurfaceView を XML で作成することです。また、GUI ビューを透明にする必要があります。グラフィックは、ここには含まれていない MainRenderer クラスで描画されることに注意してください。以下のコードには OpenGL コンテキストの損失に関する問題があることに注意してください。この問題は現在修正中です。以下に示すコードは、作業を進めるのに十分なはずですが、mod なしでは単独では機能しません... 以下のコードのほとんどは、Google の OpenGl チュートリアルから派生したものです。
OpenGl ES 1.0 チュートリアル
すべてを分離するための独自のモッズを使用します。
XML は次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<com.zypath.opengltest.MainSurfaceView
android:id="@+id/glSurfaceView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<com.zypath.opengltest.CameraView
android:id="@+id/camera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:keepScreenOn="true" />
<LinearLayout
android:id="@+id/status"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/mangle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/mangle"
android:textColor="@color/mcolor" />
</LinearLayout>
メインコードの一部:
public class Main extends Activity {
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// When working with the camera, it's useful to stick to one orientation.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//Set full screen
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
//Substantiate surfaces
cameraView = (CameraView) findViewById(R.id.camera);
mGLView = (MainSurfaceView) findViewById(R.id.glSurfaceView);
//Initialize TextViews
txtView = (TextView) findViewById(R.id.mangle);
txtView.setText("Angle: " + String.valueOf(mAngle));
}
カスタム MainSurfaceView の一部
public class MainSurfaceView extends GLSurfaceView {
...
//Constructor
public MainSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
mRenderer = new MainRenderer();
setEGLConfigChooser(8, 8, 8, 8, 16, 0);
setRenderer(mRenderer);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
setZOrderOnTop(true);
//Render only when there is a change
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
//TouchEvent handler
@Override
public boolean onTouchEvent(MotionEvent event) {
x = event.getX();
y = event.getY();
.....
return true;
}
カメラコードの一部:
public class CameraView extends SurfaceView implements SurfaceHolder.Callback {
...
private Camera camera;
SurfaceHolder holder;
public CameraView(Context context, AttributeSet attrs) {
super(context, attrs);
// We're implementing the Callback interface and want to get notified
// about certain surface events.
getHolder().addCallback( this );
// We're changing the surface to a PUSH surface, meaning we're receiving
// all buffer data from another component - the camera, in this case.
getHolder().setType( SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS );
}
public void surfaceCreated( SurfaceHolder holder ) {
// Once the surface is created, simply open a handle to the camera hardware.
camera = Camera.open();
}
public void surfaceChanged( SurfaceHolder holder, int format, int width, int height ) {
camera.setPreviewDisplay( holder );
camera.startPreview();
}