gpt4 book ai didi

android - 带有 SurfaceView 的 Camera2

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:29 25 4
gpt4 key购买 nike

我正在尝试让新的 Camera2 与简单的 SurfaceView 一起工作,但我在实时预览方面遇到了一些问题。在某些设备上图像被拉伸(stretch)不成比例,而在其他设备上看起来很好。

我设置了一个 SurfaceView,我以编程方式调整它以适应预览流大小。

在 Nexus 5 上,这看起来不错,但在一台三星设备上却差得远。此外,三星设备在预览的右侧部分有黑色边框。

是否真的无法使用 SurfaceView 或现在是切换到 TextureView 的时候?

最佳答案

是的,这当然是可能的。请注意,SurfaceView 及其关联的 Surface 是两个不同的事物,每个事物都可以/必须分配一个大小。

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

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

例如,你可以制作一个基于SurfaceView的autofit View,类似于camera2basic的AutoFitTextureView,如下(我用的就是这个):

import android.content.Context;
import android.util.AttributeSet;
import android.view.SurfaceView;

public class AutoFitSurfaceView extends SurfaceView {

private int mRatioWidth = 0;
private int mRatioHeight = 0;

public AutoFitSurfaceView(Context context) {
this(context, null);
}

public AutoFitSurfaceView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public AutoFitSurfaceView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

/**
* Sets the aspect ratio for this view. The size of the view will be measured based on the ratio
* calculated from the parameters. Note that the actual sizes of parameters don't matter, that
* is, calling setAspectRatio(2, 3) and setAspectRatio(4, 6) make the same result.
*
* @param width Relative horizontal size
* @param height Relative vertical size
*/
public void setAspectRatio(int width, int height) {
if (width < 0 || height < 0) {
throw new IllegalArgumentException("Size cannot be negative.");
}
mRatioWidth = width;
mRatioHeight = height;
requestLayout();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
if (0 == mRatioWidth || 0 == mRatioHeight) {
setMeasuredDimension(width, height);
} else {
if (width < height * mRatioWidth / mRatioHeight) {
setMeasuredDimension(width, width * mRatioHeight / mRatioWidth);
} else {
setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
}
}
}
}

关于android - 带有 SurfaceView 的 Camera2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31410118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com