本篇文章主要介绍了Android SurfaceView预览变形完美解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
这个问题百度上一搜一大把,基本上都是说找到和表面视图的比例相近的照相机预览尺寸,但是发现预览时候还是差了点意思,具体看下面这个回调就知道是为什么了。
@覆盖
公共空表面已更改(表面固定器固定器,整数格式,整数宽度,整数高度){
Log.i(标签,'表面已更改:'宽度' '高度');
}
从上面的回调打印的数据知道其实取相近的比例解决不了根本问题。
所以,对于此类的解决方法我只想说仅仅相近有神马用。
那么既然知道表面改变了的宽高就是表面视图的渲染宽高,那么想办法把表面改变了里的宽高比弄成和照相机比例一样不就行了嘛,所以看表面视图的源码:
受保护的void updateWindow(布尔强制,需要布尔重绘
.代码省略
int myWidth=mRequestedWidth
if(my width=0)my width=getWidth();
int myHeight=mRequestedHeight
if(我的身高=0)我的身高=getHeight();
.代码省略
如果(创建||格式已更改||大小已更改
| | visible changed | | realSizeChanged){
' if (DEBUG) Log.i(TAG,System.identityHashCode(this)' '
surfaceChanged - format=' mFormat
w='我的宽度h='我的高度);
if (callbacks==null) {
callbacks=get surface callbacks();
}
用于(表面固定器。回调丙:回调){
c。表面已更改(mSurfaceHolder,mFormat,myWidth,my height);
}
}
.代码省略
}
可以看到宽高其实就是调用的视角的获取高度和获取宽度或者是mRequestedWidth和请求高度。
熟悉了视角的自定义就知道获取高度和获取宽度都是和视角的测量息息相关,所以想到重写测量方法。
再从源码看到关于mRequestedWidth和mRequestedHeight的赋值
@覆盖
public void setFixedSize(int width,int height) {
if (mRequestedWidth!=width || mRequestedHeight!=高度){
mRequestedWidth=宽度;
mRequestedHeight=高度;
请求布局();
}
}
以下是完整类代码:
公共类ResizeAbleSurfaceView扩展了表面视图{
private int m width=-1;
private int MH height=-1;
公共ResizeAbleSurfaceView(上下文上下文){
超级(上下文);
}
公共ResizeAbleSurfaceView(上下文上下文,属性集属性){
超级(上下文,attrs);
}
public ResizeAbleSurfaceView(Context Context,AttributeSet attrs,int defStyleAttr) {
super(context,attrs,defStyleAttr);
}
@覆盖
受保护的测量时无效(int width measurespec,int heightMeasureSpec) {
if (-1==mWidth || -1==mHeight) {
超级棒。on measure(widthMeasureSpec,heightsmeasurespec);
}
否则{
setMeasuredDimension(mWidth,m height);
}
}
public void resize(int width,int height) {
mWidth=宽度;
mHeight=身高;
getHolder().setFixedSize(宽度,高度);
请求布局();
invalidate();
}
}
实例化的时候记得调用调整大小方法就好了。
注意和camera的预览尺寸比例一致,且宽高记得传正确,不然可能不全屏
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。