72

のプレビューを に描画する簡単なプログラムがCameraありSurfaceViewます。私がやろうとしているのは、メソッドを呼び出すはずのメソッドを実行するためにonPreviewFrame、新しいフレームが に描画されるたびに呼び出されるメソッドを使用することです。実際、メソッドは呼び出されていますが、何も印刷されていません (カメラのプレビューが、描画しようとしているテキストを上書きしていると思います)。SurfaceViewinvalidateonDrawonDraw

SurfaceViewこれは、私が持っているサブクラスの単純化されたバージョンです:

public class Superficie extends SurfaceView implements SurfaceHolder.Callback {
 SurfaceHolder mHolder;
 public Camera camera;
 Superficie(Context context) {
  super(context);
  mHolder = getHolder();
  mHolder.addCallback(this);
  mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }
 public void surfaceCreated(final SurfaceHolder holder) {
  camera = Camera.open();
  try {
   camera.setPreviewDisplay(holder);
   camera.setPreviewCallback(new PreviewCallback() {
    public void onPreviewFrame(byte[] data, Camera arg1) {
     invalidar();
    }
   });
  } catch (IOException e) {}
 }
 public void invalidar(){
  invalidate();
 }
 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
  Camera.Parameters parameters = camera.getParameters();
  parameters.setPreviewSize(w, h);
  camera.setParameters(parameters);
  camera.startPreview();
 }
 @Override
 public void draw(Canvas canvas) {
  super.draw(canvas);
  // nothing gets drawn :(
  Paint p = new Paint(Color.RED);
  canvas.drawText("PREVIEW", canvas.getWidth() / 2,
    canvas.getHeight() / 2, p);
 }
}
4

3 に答える 3

88

SurfaceViewViewおそらく、この点で通常のようには機能しません。

代わりに、次の操作を行います。

  1. どちらも Z 軸にウィジェットを積み重ねることができるため、レイアウト XML ファイルの中SurfaceViewFrameLayoutまたはを配置します。RelativeLayout
  2. 描画ロジックを別のカスタムViewクラスに移動する
  3. カスタム View クラスのインスタンスをレイアウト XML ファイルにFrameLayoutまたは の子として追加しますRelativeLayoutSurfaceView

これにより、カスタムViewクラスが の上に浮いているように見えますSurfaceView

于 2010-05-29T11:11:58.237 に答える
1

super.draw()surfaceViewのdrawメソッドで何かを行う前に、まずメソッドを呼び出す必要があると思います。

于 2011-09-20T08:04:46.653 に答える