5

簡単なカメラ アプリを作成しようとしていましたが、画像のプレビューで非常にイライラする問題に遭遇しました。画面上に横方向のちらつき線が表示されます。画面の幅が 800 (Galaxy SII plus) であるため、端に黒いスペースがあります (アクティビティは水平方向に設定されています)。ちらつきが発生すると、これらの黒い余白が下端で白灰色に移行し始めるので、それらの上に何かが描かれているのではないかと思います. 本当に厄介な部分は、これが実際のコードに依存していないように見えることです。

public class Preview extends SurfaceView implements SurfaceHolder.Callback {

    private SurfaceHolder mHolder;
    private Camera camera;
    private Point size;

Preview(Context context, Camera camera, Point size) {
    super(context);
    this.camera = camera;
    this.size = size;
    mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    setWillNotDraw(false);
    Parameters parameters = camera.getParameters();

    parameters.setPreviewSize(720, 480);
    parameters.setPictureSize(720, 480);

    camera.setParameters(parameters);
    Camera.Size previewSize = camera.getParameters().getPreviewSize();
    setLayoutParams(new FrameLayout.LayoutParams(previewSize.width,
            previewSize.height, Gravity.CENTER));

}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    if (mHolder.getSurface() == null) {
        return;
    }

    // stop preview before making changes
    try {
        camera.stopPreview();
    } catch (Exception e) {
    }

    Camera.Size previewSize = camera.getParameters().getPreviewSize();
    setLayoutParams(new FrameLayout.LayoutParams(previewSize.width,
            previewSize.height, Gravity.CENTER));

    try {
        camera.setPreviewDisplay(mHolder);
        camera.startPreview();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        camera.setPreviewDisplay(holder);
        camera.startPreview();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {

}

@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {

}

public void setCamera(Camera camera) {
    if (this.camera == camera) {
        return;
    }

    stopPreviewAndFreeCamera();

    this.camera = camera;

    if (this.camera != null) {
        requestLayout();

        try {
            this.camera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            e.printStackTrace();
        }
        this.camera.startPreview();
    }

}

public void stopPreviewAndFreeCamera() {

    if (this.camera != null) {
        this.camera.stopPreview();

        this.camera.release();

        this.camera = null;
    }
}

public void takePicture() {
    camera.autoFocus(null);
    camera.takePicture(null, null, new PictureHandler(this.getContext()));
    camera.startPreview();
}
}

public class MainActivity extends Activity {
private Preview mPreview;

    .
    .
    .

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK)) {
        this.mPreview.stopPreviewAndFreeCamera();
        finish();
    }
    return super.onKeyDown(keyCode, event);
}
    }
4

0 に答える 0