b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Android使用SurfaceView作为镜头预览识图时,视图被拉伸的问题

电脑杂谈  发布时间:2019-11-25 08:00:34  来源:网络整理

surfaceview_surfaceview surfaceholder_获取surfaceview大小

网上已经有很提到过,导致这些现象的诱因是获取surfaceview大小,传入的镜头预览图像长窄比例获取surfaceview大小,与SurfaceView本身大小长窄比例不一致。

获取surfaceview大小_surfaceview_surfaceview surfaceholder

那么解决办法也比较简单,只要获得一下设备原本支持的镜头比例,然后选取其中一个与SurfaceView实际比例(经常就是设备的长窄)最相近的即可。

获取surfaceview大小_surfaceview surfaceholder_surfaceview

下面的代码是构建一个用于相机预览的SurfaceView的过程:

surfaceview surfaceholder_surfaceview_获取surfaceview大小

//继承SurfaceView并且实现SurfaceHolder.Callback接口
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback 
{
    private static final String TAG = "CameraPreview";
    private final SurfaceHolder mHolder;
    private Camera mCamera;
    public CameraPreview(Context context, Camera camera) {
        super(context);
        mCamera = camera;
        mHolder = getHolder();
        mHolder.addCallback(this);
        //下面一行适用于Android3.0之前的设备适配,一般可以省略
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        //制定相机图像的绘制区域为这个SurfaceView,并且启动相机的预览
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        //摧毁时释放相机的资源,如果留空的话则需要在activity里释放camera
        mCamera.release();
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        //当SurfaceView尺寸变化时(包括设备横屏竖屏改变时时),需要重新设定相关参数
        if (mHolder.getSurface() == null) {
            //检查SurfaceView是否存在
            return;
        }
        //改变设置前先关闭相机
        try {
            mCamera.stopPreview();
        } catch (Exception e) {
             e.printStackTrace();
        }
        //使用最佳比例配置重启相机
        try {
            mCamera.setPreviewDisplay(mHolder);
            final Camera.Parameters parameters = mCamera.getParameters();
            final Camera.Size size = getBestPreviewSize(w, h);
            parameters.setPreviewSize(size.width, size.height);
            mCamera.setParameters(parameters);
            mCamera.startPreview();
        } catch (Exception e) {
            Log.d(TAG, "Error starting camera preview: " + e.getMessage());
        }
    }
    
    
    private Camera.Size getBestPreviewSize(int width, int height) {
    //在下面叙述
    }
 }

获取surfaceview大小_surfaceview surfaceholder_surfaceview

接下来是`getBestPreviewSize(int,int)的实现:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-131242-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...