在Android Studio上的SurfaceView上拉伸相机预览

在Android Studio上的SurfaceView上拉伸相机预览,android,camera,surfaceview,Android,Camera,Surfaceview,这是我缩小SurfaceView时得到的结果。如何修复此问题,使其显示正确的纵横比?我不想使用我从相机得到的全部图像,只想使用其中的一部分 想象一下Facebook messenger应用程序,当你想从该应用程序中即时拍照时,会出现一个小的摄像头窗口。我想要同样的结果。这是我的密码: import android.content.Context; import android.hardware.Camera; import android.util.Log; import android.vie

这是我缩小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;
    }

}
导入android.content.Context;
导入android.hardware.Camera;
导入android.util.Log;
导入android.view.SurfaceHolder;
导入android.view.SurfaceView;
导入java.io.IOException;
导入java.util.List;
公共类CameraPreview扩展了SurfaceView实现了SurfaceHolder.Callback{
公共静态最终字符串TAG=“AKSQS”;
私人地勤人员;
私人摄像机麦卡梅拉;
公共摄像机回顾(上下文、摄像机){
超级(上下文);
mCamera=摄像机;
mHolder=getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE\u TYPE\u PUSH\u缓冲区);
}
@凌驾
已创建的公共空白表面(表面持有人){
试一试{
mCamera.setPreviewDisplay(支架);
mCamera.startPreview();
}捕获(IOE异常){
Log.d(标记“错误设置相机预览:”+e.getMessage());
}
}
@凌驾
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
//注意这里的旋转和调整大小。
mCamera.stopPreview();
mCamera.setDisplayOrientation(90);
Camera.Parameters=mCamera.getParameters();
列表大小=参数。getSupportedPreviewSizes();
用于(Camera.Size sizesl:sizes){
//这只是为了查看支持的预览大小。
Log.d(标签,“宽度:”+String.valueOf(sizesl.Width));
Log.d(标记,“高度:”+String.valueOf(sizesl.Height));
日志d(标签“----------”);
}
//参数setPreviewSize(1080288);
mCamera.setParameters(参数);
mCamera.startPreview();
if(mHolder.getSurface()==null){
返回;
}
试一试{
mCamera.stopPreview();
}捕获(例外e){
Log.d(标记“试图停止不存在的预览”。消息:+e.getMessage());
}
试一试{
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
}捕获(例外e){
Log.d(标记“启动camra预览时出错:”+e.getMessage());
}
}
@凌驾
公共空间表面覆盖(表面覆盖物持有人){
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>

以下是我得到的结果:


这件事困扰了我一个月。我终于在这里找到了答案:

以下是最终结果:


您也可以使用框架布局来完成此操作;参见例如Grafika及其在PlayMovieSurfaceActivity类中的使用方式。