Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 带表面视图的摄像机2_Android_Android Camera_Surfaceview_Textureview - Fatal编程技术网

Android 带表面视图的摄像机2

Android 带表面视图的摄像机2,android,android-camera,surfaceview,textureview,Android,Android Camera,Surfaceview,Textureview,我正在尝试让新的Camera2使用一个简单的SurfaceView,但我在现场预览时遇到了一些问题。在一些设备上,图像被拉伸成比例,而在其他设备上看起来很好 我已经设置了一个SurfaceView,我通过编程调整它以适应预览流大小 在Nexus5上,这看起来不错,但三星的一款设备已经过时了。此外,三星设备在预览的右侧有一个黑色边框 是否真的不可能使用SurfaceView,或者现在是切换到TextureView的时候了?我从未使用过Camera2(但对新技术非常感兴趣),我只能建议您按照示例进行

我正在尝试让新的Camera2使用一个简单的SurfaceView,但我在现场预览时遇到了一些问题。在一些设备上,图像被拉伸成比例,而在其他设备上看起来很好

我已经设置了一个SurfaceView,我通过编程调整它以适应预览流大小

在Nexus5上,这看起来不错,但三星的一款设备已经过时了。此外,三星设备在预览的右侧有一个黑色边框


是否真的不可能使用SurfaceView,或者现在是切换到TextureView的时候了?

我从未使用过Camera2(但对新技术非常感兴趣),我只能建议您按照示例进行操作。如果仔细检查,该示例使用自定义的
TextureView
,您应该尝试将其复制到您的项目中:


还考虑到SurfaceView和TextureView(理论上)的不同之处在于,您可以在布局中用作普通视图,而其他视图在视图层次结构中“冲压一个整体”,Camera2仅在API21+中可用。。。迁移到
TextureView应该没有什么害处是的,这当然是可能的。请注意,
SurfaceView
及其关联的
Surface
是两个不同的东西,每个都可以/必须指定一个大小

Surface
是实际的内存缓冲区,用于保存相机的输出,因此设置其大小决定了从每一帧获得的实际图像的大小。对于相机提供的每种格式,都有一组可能的(精确的)大小,您可以制作此缓冲区

SurfaceView
是在该图像可用时显示该图像的功能,基本上可以是布局中的任何大小。它将拉伸其底层关联的图像数据,以适应其布局大小,但请注意,此显示大小与数据大小不同-Android将自动调整图像数据的显示大小。这可能是导致你拉伸的原因

例如,您可以使基于
SurfaceView
的autofit视图类似于camera2basic的AutoFitTextureView,如下所示(这就是我使用的):

导入android.content.Context;
导入android.util.AttributeSet;
导入android.view.SurfaceView;
公共类AutoFitSurfaceView扩展了SurfaceView{
私有宽度=0;
私有内部高度=0;
公共AutoFitSurfaceView(上下文){
这个(上下文,空);
}
公共AutoFitSurfaceView(上下文、属性集属性){
这(上下文,属性,0);
}
公共AutoFitSurfaceView(上下文上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
}
/**
*设置此视图的纵横比。将根据纵横比测量视图的大小
*根据参数计算。请注意,参数的实际大小并不重要
*是,调用setAspectRatio(2,3)和setAspectRatio(4,6)会得到相同的结果。
*
*@param宽度相对水平尺寸
*@param高度相对垂直尺寸
*/
公共无效设置AspectRatio(内部宽度、内部高度){
如果(宽度<0 | |高度<0){
抛出新的IllegalArgumentException(“大小不能为负”);
}
宽度=宽度;
高度=高度;
requestLayout();
}
@凌驾
测量时的保护空隙(内部宽度测量等级、内部高度测量等级){
超级测量(宽度测量、高度测量);
int width=MeasureSpec.getSize(widthmasurespec);
int height=MeasureSpec.getSize(heightMeasureSpec);
如果(0==mRatioWidth | | 0==mRatioHeight){
设置测量尺寸(宽度、高度);
}否则{
if(宽度<高度*mRatioWidth/mRatioHeight){
设置测量尺寸(宽度、宽度*mRatioHeight/mRatioWidth);
}否则{
设置测量尺寸(高度*mRatioWidth/mRatioHeight,高度);
}
}
}
}
在它的文档中说

用于绘制到曲面视图:一旦曲面视图的曲面 创建后,使用setFixedSize(int,int)将曲面的大小设置为 getOutputSizes(SurfaceHolder.class)返回的大小之一


我确实从那里开始,并将其移植到曲面视图中-就在那时,屎开始击中风扇:(好吧。考虑到TextureView是API 14,Camera2是API 21,真的没有理由。只是把它切换回去,不是吗?在跨平台库上工作-所以最小值是11,所以让它工作会很好…但如果不是的话,min将是14…类似这样的东西,但也包括Camera2。听起来很酷。但我的说法仍然是正确的。你可以单独使用
layout/camera
layout-v21/camera
来正确处理新版本和旧版本。是的,它本质上是一个替代品,还有一些东西,比如预览视图嵌入听起来预览的大小和你想象的不一样。你可以找到一个类似的问题,以及一些使用
dumpsys
检查pr的技巧问题,在这篇文章中:你有没有找到一种方法来使用SurfaceView和Camera2,而不使用失真的预览?我转到了TextureView-这也是更灵活的。这正是我所拥有的-基于谷歌的Camera2基本代码。问题是,在表面上显示的实际图像在一些设备上,如三星S4和Nex,是失真的us 4-但在Nexus 5上看起来不错。我尝试了很多方法-甚至硬编码的表面大小与支持的预览大小相匹配-结果仍然是扭曲的视图。使用TextureView,一切都很好,很漂亮-除了我的骄傲:(你在不正常的设备上设置表面的图像的纵横比是多少?我只是猜测,没有看到你所说的失真图像,但是三星返回16吗
/**
 * A {@link TextureView} that can be adjusted to a specified aspect ratio.
 */
public class AutoFitTextureView extends TextureView {