在自定义相机android中拉伸预览

时间:2016-08-22 12:57:56

标签: android api

我正在使用本书“Pro Android Media”中的代码 为智能手机和平板电脑开发图形,音乐,视频和富媒体应用程序“,我有相机预览问题

我在我的应用中使用了相机API

我遇到了一些问题:

1)显示器出现在拉伸的情况下,在最低链接的情况下显示相机原始手机和自定义相机之间的差异

here video for my problem i face

OR here video for my problem i face

1 个答案:

答案 0 :(得分:0)

我在某处找到的以下代码对我有所帮助。

您必须根据屏幕尺寸缩放预览,并且此方法应该足够了,

private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
    final double ASPECT_TOLERANCE = 0.1;
    double targetRatio=(double)h / w;

    if (sizes == null) return null;

    Camera.Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;

    int targetHeight = h;

    for (Camera.Size size : sizes) {
        double ratio = (double) size.width / size.height;
        if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
        if (Math.abs(size.height - targetHeight) < minDiff) {
            optimalSize = size;
            minDiff = Math.abs(size.height - targetHeight);
        }
    }

    if (optimalSize == null) {
        minDiff = Double.MAX_VALUE;
        for (Camera.Size size : sizes) {
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }
    }
    return optimalSize;
}

现在你要覆盖预览活动中的onMeasure,我认为这是像这样扩展SurfaceView,

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
    final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
    setMeasuredDimension(width, height);

    if(mCamera != null) {
        List<Camera.Size> mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();

        if (mSupportedPreviewSizes != null) {
            mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
        }
    }
}

并最终使用onMeasure计算的预测调整大小开始预览,

// start preview with new settings
    try {
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);

        mCamera.setParameters(parameters);
        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();
        isSafeToTakePicture = true;

    } catch (Exception e){
        Log.d(TAG, "Error starting camera preview: " + e.getMessage());
    }