CameraXを学習しています。 CameraXBasic はサンプルコードです。
CameraFragment.kt に基づいて、zoomX関数を記述します。コードAを見ることができます。関数はいつでも画像を拡大できます。
zoomX(2f)
、zoomX(3f)
などの小さい値で呼び出すと、画像を拡大できることがわかりましたが、大きな値を使用すると、画像が再び拡大されません。 zoomX(6.0f)
、zoomX(7.0f)
などの値...なぜですか?
コードA
private lateinit var viewFinder: TextureView
private var preview: Preview? = null
fun zoomX(orign: Float ){
val x=orign+1
val singleWidth=viewFinder.width/x
val singleHeight=viewFinder.height/x
val left=viewFinder.width/2f-singleWidth/2f
val right=left+singleWidth
val top=viewFinder.height/2f-singleHeight/2f
val bottom=top+singleHeight
val my= Rect(left.toInt(), top.toInt(), right.toInt(), bottom.toInt())
preview?.zoom(my)
}
これは伝統の問題ではなく、Futures
の問題です。 CameraXBasic の例を_1.0.0-alpha06
_から_1.0.0-alpha08
_に更新すると多くの問題が発生しますが、CameraX CameraControl には次の2つのメソッドがあります。
_
0f
_から_1.0f
_までの線形ズーム値によって現在のズームを設定します。_
linearZoom 0f
_は最小ズームを表し、_linearZoom 1.0f
_は最大ズームを表します。linearZoom
の利点は、スライダーUI要素で使用するために、視野(FOV)がlinearZoom
の値とともに直線的に変化することを保証することです(一方、setZoomRatio(float)
はピンチズームジェスチャー)。
現在のズームを比率で設定します。
現在の
zoomRatio
とlinearZoom
の両方を変更するため、アプリがzoomRatio
またはlinearZoom
を監視している場合は、更新も取得されます。比率がCameraInfo.getMinZoomRatio()
より小さいか、CameraInfo.getMaxZoomRatio()
より大きい場合、返されたListenableFuture
はIllegalArgumentException
で失敗し、現在のズーム率は変更されません。比率をクランプするのはアプリケーションの義務です。
Executor も参照してください CameraXExecutors
もあります。
CameraXBasicの例を壊すすべてのAPIの変更については、 リリースノート または commits ...も参照してください。これらのAPIの違いについてはこれ以上説明しません(これは問題ではなかったためです)が、 fork forked it; issues#131 を参照してください(これまでのところ、少なくともプレビューはそこで機能します)。
これが実際に機能する方法です。
_val camera: Camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
val control: CameraControl = camera.cameraControl
control.setZoomRatio(5.0f)
_
_1.0f
_から_8.0f
_までのズーム比は、Motorola XT1900で機能します。
_val info: CameraInfo = camera.cameraInfo
val cameraId = (info as Camera2CameraInfoImpl).cameraId
val zoomRatio = info.getZoomRatio().value
val maxZoomRatio = info.getMaxZoomRatio().value
val minZoomRatio = info.getMinZoomRatio().value
val linearZoom = info.getLinearZoom().value
_
Android伝統、ズームレベルは0
と1
の間にあり、他の多くの値と同じです。
0
は、最低のズームレベルを意味します。
1
は最大ズームレベルを意味します。
これは浮動小数点値なので、0.1
、0.2
、0.9
などのように増やします。
まず最初に、getMaxZoom()
メソッドを使用して、カメラの最大ズーム値を見つけます。
https://developer.Android.com/reference/Android/hardware/Camera.Parameters.html#getMaxZoom()
カメラプレビューを使用している場合は、Rect
を使用してカメラプレビューのズームインを設定できます。以下のように-
PreviewConfig config = new PreviewConfig.Builder().build();
Preview preview = new Preview(config);
Rect rect = Rect(left, top, right, bottom);
preview.zoom(rect)
preview.setOnPreviewOutputUpdateListener(
new Preview.OnPreviewOutputUpdateListener() {
@Override
public void onUpdated(Preview.PreviewOutput previewOutput) {
// Your code here. For example, use previewOutput.getSurfaceTexture()
// and post to a GL renderer.
};
});
CameraX.bindToLifecycle((LifecycleOwner) this, preview);
詳細はこちらからご覧いただけます- Androidカメラプレビューズーム、ダブルフィンガータッチを使用