J'apprends CameraX, et CameraXBasic est un exemple de code.
J'écris une fonction zoomX basée CameraFragment.kt . vous pouvez voir le code A. Je pense que la fonction peut zoomer sur une image à tout moment.
Je trouve qu'une image peut être agrandie lorsque je l'invoque avec une petite valeur sa, telle que zoomX(2f)
, zoomX(3f)
, mais l'image ne sera plus agrandie lorsque j'utiliserai un grand valeur telle que zoomX(6.0f)
, zoomX(7.0f)
... pourquoi?
Code 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)
}
Ce n'est pas une question de tradition, mais de Futures
. La mise à jour de cet exemple CameraXBasic de 1.0.0-alpha06
Vers 1.0.0-alpha08
Casse beaucoup, mais CameraX CameraControl propose ces deux méthodes:
Définit le zoom actuel par une valeur de zoom linéaire allant de
0f
À1.0f
.
linearZoom 0f
Représente le zoom minimum tandis quelinearZoom 1.0f
Représente le zoom maximum. L'avantage delinearZoom
est qu'il garantit que le champ de vision (FOV) varie linéairement avec la valeurlinearZoom
, pour une utilisation avec des éléments d'interface utilisateur de curseur (tandis quesetZoomRatio(float)
fonctionne bien pour gestes de pincement).
Définit le zoom actuel par rapport.
Il modifie à la fois les
zoomRatio
etlinearZoom
actuels, donc si les applications observentzoomRatio
oulinearZoom
, elles obtiendront également la mise à jour. Si le rapport est inférieur àCameraInfo.getMinZoomRatio()
ou supérieur àCameraInfo.getMaxZoomRatio()
, leListenableFuture
renvoyé échouera avecIllegalArgumentException
et ne modifiera pas le taux de zoom actuel . C'est le devoir des applications de restreindre le rapport.
Voir aussi Executor et il y a aussi CameraXExecutors
.
Voir également les notes de version ou commits ... pour toutes les modifications de l'API, qui cassent l'exemple CameraXBasic. Je n'expliquerai plus ces différences API (puisque ce n'était pas la question), mais ont bifurqué it; voir problèmes # 131 (jusqu'à présent, au moins l'aperçu fonctionne là-bas).
Voici comment cela fonctionne réellement:
val camera: Camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
val control: CameraControl = camera.cameraControl
control.setZoomRatio(5.0f)
Les rapports de zoom de 1.0f
Jusqu'à 8.0f
Fonctionnent sur mon 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
C'est une tradition Android, le niveau de zoom existe entre 0
et 1
comme beaucoup d'autres valeurs ..
0
signifie le niveau de zoom le plus bas.
1
signifie le niveau de zoom maximum.
C'est une valeur flottante donc vous l'augmentez comme 0.1
, 0.2
, 0.9
etc.
Tout d'abord, déterminez la valeur de zoom maximale de la caméra - en utilisant la méthode getMaxZoom()
.
https://developer.Android.com/reference/Android/hardware/Camera.Parameters.html#getMaxZoom ()
Si vous avez utilisé l'aperçu de l'appareil photo, vous pouvez définir le zoom dans l'aperçu de l'appareil photo à l'aide de Rect
. Comme ci-dessous -
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);
Vous pouvez obtenir plus de détails à partir d'ici - Zoom de prévisualisation de la caméra Android en utilisant le toucher du double doigt