android - Android Studio 中 SurfaceView 上的拉伸(stretch)相机预览

标签 android camera surfaceview

这是当我缩小 SurfaceView 时得到的结果。如何解决此问题以使其显示正确的宽高比?我不想使用从相机获得的整个图像,而只想使用其中的一部分。

将其想象为 Facebook Messenger 应用程序,当您想从该应用程序拍摄即时照片时,会出现一个小相机窗口。我想要同样的结果。这是我的代码:

import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.IOException;
import java.util.List;

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

    public static final String TAG = "AKSQS";
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraPreview(Context context, Camera camera) {
        super(context);
        mCamera = camera;
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }


    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        //Take care of rotation and resizing here.

        mCamera.stopPreview();
        mCamera.setDisplayOrientation(90);

        Camera.Parameters parameters = mCamera.getParameters();
        List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
        for (Camera.Size sizesl : sizes) {
            //This is just to see the supported preview sizes.
            Log.d(TAG, "Width: " + String.valueOf(sizesl.width));
            Log.d(TAG, "Height: " + String.valueOf(sizesl.height));
            Log.d(TAG, "--------");
        }
//        parameters.setPreviewSize(1080,288);

        mCamera.setParameters(parameters);

        mCamera.startPreview();

        if (mHolder.getSurface() == null) {
            return;
        }

        try {
            mCamera.stopPreview();
        } catch (Exception e) {
            Log.d(TAG, "Tried to stop a non-existing preview. Message: " + e.getMessage());
        }

        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();
        } catch (Exception e) {
            Log.d(TAG, "Error starting camra preview: " + e.getMessage());
        }

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

}

这是我的 xml 文件:

<RelativeLayout ...>

<FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="250dp"
        android:id="@+id/camera_preview"
        android:layout_alignParentBottom="true">
    </FrameLayout>

</RelativeLayout>

这是我得到的结果:

/image/AEx2C.jpg

最佳答案

这个问题已经困扰我一个月了。我终于在这里找到了答案:

https://stackoverflow.com/a/22758359/5273230

最终结果如下:

/image/kA7CP.jpg

关于android - Android Studio 中 SurfaceView 上的拉伸(stretch)相机预览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32277379/

相关文章:

android - SurfaceView 未显示

android - 在 onPreviewFrame() 中重新添加回调缓冲区时相机预览变慢

android - 相机预览的纹理 View /表面 View - Android

android - 使用 Kotlin 在 fragment 中创建 AlertDialog

android - ViewPager、FragmentStatePagerAdapter 和无限滚动

android - 当我在 android 中重新启动应用程序时获得相同的复选框状态

c# - 在 Picturebox 上显示从相机检索到的位图的实验

Android - 访问 MainActivity 实例

ios - 相机 View 在 Swift 中旋转 90 度

ios - Cordova reader.onloadend没有被解雇