[英]Is it possible to zoom cameraX or Camera2 beyond the Api max zoom limit
所以我正在嘗試制作雙筒望遠鏡/望遠鏡類的應用程序,但問題是我想放大到最大。 我已經看到商店中有應用程序可以做到這一點,但不確定如何。 我已經嘗試過 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
中使用的 TextureView 包含在ZoomLinearLayout
之間:
<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
只是片段(TextureView)的容器,它負責 camera2 的所有艱苦工作,這是我的最終結果:
注意:結果是通過僅在視圖內部進行縮放得出的,如果將其與相機的縮放結合起來,您將獲得更平滑的結果!
我相信您嘗試做的事情可能不太可能,並且完全取決於物理移動相機的能力,除非應用程序的 function 是自動放大車載相機拍攝的圖像。 閱讀 api 文檔,看看 api 是否允許在 android 相機上比平時放大更多。 祝你好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.