gpt4 book ai didi

android - 是否可以将 cameraX 或 Camera2 缩放到 Api 最大缩放限制之外

转载 作者:行者123 更新时间:2023-12-03 16:49:10 24 4
gpt4 key购买 nike

所以我正在尝试制作双筒望远镜/望远镜类的应用程序,但问题是我想放大到最大。我已经看到商店中有应用程序可以做到这一点,但不确定如何。我已经尝试过 cameraX linearZoom 方法,但它只能在 0f - 1f 之间的范围内工作或者是否可以使用 Camera2 api 来做到这一点?任何帮助将不胜感激。请注意,我只是在尝试或研究了一整天不同的东西后才发布了这个问题。

谢谢

最佳答案

出于对这个问题的好奇,我决定投身尝试,我发现的解决方案不是最传统的,但它目前有效。

在我第一次尝试后,我发现无法增加摄像头 max_zoom所以我想了另一种方法来放大我在屏幕上发送的内容。

我的解决方案基于您放置 textureView 的主要布局。就我而言,我决定使用 LinearLayout ,按照其他一些指南,我可以通过捏它来放大。

    public class ZoomLinearLayout extends LinearLayout implements ScaleGestureDetector.OnScaleGestureListener {

private enum Mode {
NONE,
DRAG,
ZOOM
}

private static final float MIN_ZOOM = 1.0f;
private static final float MAX_ZOOM = 10.0f;

private Mode mode = Mode.NONE;
private float scale = 1.0f;
private float lastScaleFactor = 0f;

private float startX = 0f;
private float startY = 0f;

private float dx = 0f;
private float dy = 0f;
private float prevDx = 0f;
private float prevDy = 0f;

public ZoomLinearLayout(Context context) {
super(context);
init(context);
}

public ZoomLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}

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

@SuppressLint("ClickableViewAccessibility")
public void init(Context context) {
final ScaleGestureDetector scaleDetector = new ScaleGestureDetector(context, this);
this.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
if (scale > MIN_ZOOM) {
mode = Mode.DRAG;
startX = motionEvent.getX() - prevDx;
startY = motionEvent.getY() - prevDy;
}
break;
case MotionEvent.ACTION_MOVE:
if (mode == Mode.DRAG) {
dx = motionEvent.getX() - startX;
dy = motionEvent.getY() - startY;
}
break;
case MotionEvent.ACTION_POINTER_DOWN:
mode = Mode.ZOOM;
break;
case MotionEvent.ACTION_POINTER_UP:
mode = Mode.DRAG;
break;
case MotionEvent.ACTION_UP:
mode = Mode.NONE;
prevDx = dx;
prevDy = dy;
break;
}
scaleDetector.onTouchEvent(motionEvent);

if ((mode == Mode.DRAG && scale >= MIN_ZOOM) || mode == Mode.ZOOM) {
getParent().requestDisallowInterceptTouchEvent(true);
float maxDx = (child().getWidth() - (child().getWidth() / scale)) / 2 * scale;
float maxDy = (child().getHeight() - (child().getHeight() / scale)) / 2 * scale;
dx = Math.min(Math.max(dx, -maxDx), maxDx);
dy = Math.min(Math.max(dy, -maxDy), maxDy);
applyScaleAndTranslation();
}

return true;
}
});
}

@Override
public boolean onScaleBegin(ScaleGestureDetector scaleDetector) {
return true;
}

@Override
public boolean onScale(ScaleGestureDetector scaleDetector) {
float scaleFactor = scaleDetector.getScaleFactor();
if (lastScaleFactor == 0 || (Math.signum(scaleFactor) == Math.signum(lastScaleFactor))) {
scale *= scaleFactor;
scale = Math.max(MIN_ZOOM, Math.min(scale, MAX_ZOOM));
lastScaleFactor = scaleFactor;
} else {
lastScaleFactor = 0;
}
return true;
}

@Override
public void onScaleEnd(ScaleGestureDetector scaleDetector) {
}

private void applyScaleAndTranslation() {
child().setScaleX(scale);
child().setScaleY(scale);
child().setTranslationX(dx);
child().setTranslationY(dy);
}

private View child() {
return getChildAt(0);
}

}

管理我们最大变焦的不再是相机的力量,而是我们的变量 MAX_ZOOM在我们的例子中,女巫设置为 10.0f(但您实际上可以更改它)。

下一步是附上 TextureView用于 ZoomLinearLayout之间的camera2 :
    <com.giacomociardini.zoom.ZoomLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000" />

</com.giacomociardini.zoom.ZoomLinearLayout>
FrameLayout只是负责camera2所有艰苦工作的 fragment (TextureView)的容器,这是我的最终结果:

video

photo

注意:结果是通过仅在 View 内部进行缩放得出的,如果将其与相机的缩放结合起来,您将获得更平滑的结果!

关于android - 是否可以将 cameraX 或 Camera2 缩放到 Api 最大缩放限制之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61293527/

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