Android SurfaceView预览变形完美解决方法
这个问题百度上一搜一大把,基本上都是说找到和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预览变形完美解决方法相关推荐
- Android view变形,Android SurfaceView预览变形完美解决方法
这个问题百度上一搜一大把,基本上都是说找到和SurfaceView的比例相近的camera预览尺寸,但是发现预览时候还是差了点意思,具体看下面这个回调就知道是为什么了. @Override publi ...
- android 平板预览变形,Android SurfaceView预览变形完美解决方法
这个问题百度上一搜一大把,基本上都是说找到和SurfaceView的比例相近的camera预览尺寸,但是发现预览时候还是差了点意思,具体看下面这个回调就知道是为什么了. @Override publi ...
- android 触摸变形,Android SurfaceView预览变形完美解决
转载请注明出处:https://www.jianshu.com/p/0ea58e77ef57 这个问题百度上一搜一大把,基本上都是说找到和SurfaceView的比例相近的camera预览尺寸,但是发 ...
- 预览文件乱码解决方法记录
设置后端编码格式为utf-8 1.在配置文件application.yml文件中加入以下代码: 2.在页面加入以下代码: 3.本项目预览是请求的nginx,不是请求后端预览接口,在nginx配置文件中 ...
- 网页上下标标签预览显示框框解决方法
产生原因 网页版特殊字符,如上下标 CO₂.黄曲霉毒素B₁,因不同电脑字体库稍微存在差异,导致win7打印含有该特殊字符的标签.文件时,打印出来的上下标显示为框框,而Win10打印出来却正常.显示为框 ...
- android出现Failed to load AppCompat ActionBar with unknown error.无法预览视图布局解决方法
打开如图文件\app\src\main\res\values\styles.xml在第二行处添加Base.即可.
- a标签点击下载文件通用方法,pdf文件预览不能下载解决方法
function downloadFile(url) {var request = new XMLHttpRequest();request.responseType = "blob&quo ...
- Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView)
[后注:]下载代码的注意,我的手机是4.3寸的屏,华为U9200.如果不能运行的请修改参数.看前文的第四条.Y的,省的说我传的代码不能用 最近一直在审视以前做过的东西,关于android摄像头预览, ...
- Android摄像头 只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理 底层Surface
[后注:]下载代码的注意,我的手机是4.3寸的屏,华为U9200.如果不能运行的请修改参数.看前文的第四条.Y的,省的说我传的代码不能用 最近一直在审视以前做过的东西,关于android摄像头预览, ...
最新文章
- ZeroMQ在windows下不同语言的编译
- Css 浏览器兼容性及其其他常见问题
- 中标麒麟桌面版yum安装mysql_中标麒麟Neokylin6桌面版如何本地yum安装软件
- .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析
- cocos2d-x 3.0rc2中读取sqlite文件
- Visual Studio IDE下载地址
- angular 实现无限极联动下拉
- 重磅预告!企业上云的正确姿势
- MSSQL生成连续的时间
- AAC 文件解析及解码流程
- LabVIEW学习笔记1
- VS2017离线下载及安装方式
- 楼板计算塑形弹性_楼板计算的塑性铰线理论原理与运用详解.doc
- Windows系统下hosts文件工作原理(转)
- linux目录显示蓝色,centos系统创建文件夹目录显示颜色
- 双线macd指标参数最佳设置_经典实用的双线MACD指标
- Flutter-如何计算文字宽高
- Deadline = Diedline?拖延症幻想美好
- 【微信小程序】全局数据共享
- 接口与抽象类的区别,为什么要用接口,抽象类不香吗?
热门文章
- 62套儿童行业响应式Html5儿童慈善机构网站模板儿童公益组织企业官网模板儿童慈善CSS模板下载婴儿树儿童健康食品整站模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响
- openlayers 利用克里金插值法渲染等值面
- Launcher 的启动
- 开源3D激光SLAM项目BLAM
- andorid Telephony 整体介绍
- 交互设计师怎样做网页产品的“原型设计”?
- 当年明月《明朝那些事儿》读书笔记
- fixed脱离文档流 不占位置
- 小程序的三种弹框showToast、showModal、showLoading
- golang 编译错误:unknown revision xxx