这个问题百度上一搜一大把,基本上都是说找到和SurfaceView的比例相近的camera预览尺寸,但是发现预览时候还是差了点意思,具体看下面这个回调就知道是为什么了。

  @Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {Log.i(TAG, "surfaceChanged: " + width + " " + height);}

从上面的回调打印的数据知道其实取相近的比例解决不了根本问题

所以,对于此类的解决方法我只想说仅仅相近有神马用。

那么既然知道surfaceChanged的宽高就是SurfaceView的渲染宽高,那么想办法把surfaceChanged里的宽高比弄成和camera比例一样不就行了嘛,所以看SurfaceView的源码:

protected void updateWindow(boolean force, boolean redrawNeeded) {...代码省略int myWidth = mRequestedWidth;if (myWidth <= 0) myWidth = getWidth();int myHeight = mRequestedHeight;if (myHeight <= 0) myHeight = getHeight();...代码省略if (creating || formatChanged || sizeChanged|| visibleChanged || realSizeChanged) {if (DEBUG) Log.i(TAG, System.identityHashCode(this) + " "+ "surfaceChanged -- format=" + mFormat+ " w=" + myWidth + " h=" + myHeight);if (callbacks == null) {callbacks = getSurfaceCallbacks();}for (SurfaceHolder.Callback c : callbacks) {c.surfaceChanged(mSurfaceHolder, mFormat, myWidth, myHeight);}}...代码省略}

可以看到宽高其实就是调用的View的getHeight和getWidth或者是mRequestedWidth和mRequestedHeight。

熟悉了View的自定义就知道getHeight和getWidth都是和View的onMeasure息息相关,所以想到重写onMeasure方法。

再从源码看到关于mRequestedWidth和mRequestedHeight的赋值

@Overridepublic void setFixedSize(int width, int height) {if (mRequestedWidth != width || mRequestedHeight != height) {mRequestedWidth = width;mRequestedHeight = height;requestLayout();}}

以下是完整类代码:

public class ResizeAbleSurfaceView extends SurfaceView {private int mWidth = -1;private int mHeight = -1;public ResizeAbleSurfaceView(Context context) {super(context);}public ResizeAbleSurfaceView(Context context, AttributeSet attrs) {super(context, attrs);}public ResizeAbleSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {if (-1 == mWidth || -1 == mHeight) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}else {setMeasuredDimension(mWidth, mHeight);}}public void resize(int width, int height) {mWidth = width;mHeight = height;getHolder().setFixedSize(width, height);requestLayout();invalidate(); }
}

Android SurfaceView预览变形完美解决方法相关推荐

  1. Android view变形,Android SurfaceView预览变形完美解决方法

    这个问题百度上一搜一大把,基本上都是说找到和SurfaceView的比例相近的camera预览尺寸,但是发现预览时候还是差了点意思,具体看下面这个回调就知道是为什么了. @Override publi ...

  2. android 平板预览变形,Android SurfaceView预览变形完美解决方法

    这个问题百度上一搜一大把,基本上都是说找到和SurfaceView的比例相近的camera预览尺寸,但是发现预览时候还是差了点意思,具体看下面这个回调就知道是为什么了. @Override publi ...

  3. android 触摸变形,Android SurfaceView预览变形完美解决

    转载请注明出处:https://www.jianshu.com/p/0ea58e77ef57 这个问题百度上一搜一大把,基本上都是说找到和SurfaceView的比例相近的camera预览尺寸,但是发 ...

  4. 预览文件乱码解决方法记录

    设置后端编码格式为utf-8 1.在配置文件application.yml文件中加入以下代码: 2.在页面加入以下代码: 3.本项目预览是请求的nginx,不是请求后端预览接口,在nginx配置文件中 ...

  5. 网页上下标标签预览显示框框解决方法

    产生原因 网页版特殊字符,如上下标 CO₂.黄曲霉毒素B₁,因不同电脑字体库稍微存在差异,导致win7打印含有该特殊字符的标签.文件时,打印出来的上下标显示为框框,而Win10打印出来却正常.显示为框 ...

  6. android出现Failed to load AppCompat ActionBar with unknown error.无法预览视图布局解决方法

    打开如图文件\app\src\main\res\values\styles.xml在第二行处添加Base.即可.

  7. a标签点击下载文件通用方法,pdf文件预览不能下载解决方法

    function downloadFile(url) {var request = new XMLHttpRequest();request.responseType = "blob&quo ...

  8. Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView)

    [后注:]下载代码的注意,我的手机是4.3寸的屏,华为U9200.如果不能运行的请修改参数.看前文的第四条.Y的,省的说我传的代码不能用  最近一直在审视以前做过的东西,关于android摄像头预览, ...

  9. Android摄像头 只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理 底层Surface

    [后注:]下载代码的注意,我的手机是4.3寸的屏,华为U9200.如果不能运行的请修改参数.看前文的第四条.Y的,省的说我传的代码不能用  最近一直在审视以前做过的东西,关于android摄像头预览, ...

最新文章

  1. ZeroMQ在windows下不同语言的编译
  2. Css 浏览器兼容性及其其他常见问题
  3. 中标麒麟桌面版yum安装mysql_中标麒麟Neokylin6桌面版如何本地yum安装软件
  4. .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析
  5. cocos2d-x 3.0rc2中读取sqlite文件
  6. Visual Studio IDE下载地址
  7. angular 实现无限极联动下拉
  8. 重磅预告!企业上云的正确姿势
  9. MSSQL生成连续的时间
  10. AAC 文件解析及解码流程
  11. LabVIEW学习笔记1
  12. VS2017离线下载及安装方式
  13. 楼板计算塑形弹性_楼板计算的塑性铰线理论原理与运用详解.doc
  14. Windows系统下hosts文件工作原理(转)
  15. linux目录显示蓝色,centos系统创建文件夹目录显示颜色
  16. 双线macd指标参数最佳设置_经典实用的双线MACD指标
  17. Flutter-如何计算文字宽高
  18. Deadline = Diedline?拖延症幻想美好
  19. 【微信小程序】全局数据共享
  20. 接口与抽象类的区别,为什么要用接口,抽象类不香吗?

热门文章

  1. 62套儿童行业响应式Html5儿童慈善机构网站模板儿童公益组织企业官网模板儿童慈善CSS模板下载婴儿树儿童健康食品整站模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响
  2. openlayers 利用克里金插值法渲染等值面
  3. Launcher 的启动
  4. 开源3D激光SLAM项目BLAM
  5. andorid Telephony 整体介绍
  6. 交互设计师怎样做网页产品的“原型设计”?
  7. 当年明月《明朝那些事儿》读书笔记
  8. fixed脱离文档流 不占位置
  9. 小程序的三种弹框showToast、showModal、showLoading
  10. golang 编译错误:unknown revision xxx