J'ai travaillé sur la création de mon activité de caméra personnalisée sur Android, mais lorsque je tourne la caméra, le rapport hauteur/largeur de la vue surface est perturbé.
Dans mon onCreate pour l'activité, j'ai défini le framelayout qui contient la vue surface qui affiche les paramètres de la caméra.
//FrameLayout qui contiendra l'aperçu de la caméra
FrameLayout previewHolder = (FrameLayout) findViewById(R.id.camerapreview);
//Définition de la taille de l'aperçu de la caméra pour la meilleure taille d'aperçu
Size optimalSize = null;
camera = getCameraInstance();
double aspectRatio = 0;
if(camera != null){
//Définition du rapport hauteur/largeur de la caméra
Camera.Parameters parameters = camera.getParameters();
List sizes = parameters.getSupportedPreviewSizes();
optimalSize = CameraPreview.getOptimalPreviewSize(sizes, getResources().getDisplayMetrics().widthPixels, getResources().getDisplayMetrics().heightPixels);
aspectRatio = (float)optimalSize.width/optimalSize.height;
}
if(optimalSize!= null){
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, (int)(getResources().getDisplayMetrics().widthPixels*aspectRatio));
previewHolder.setLayoutParams(params);
LayoutParams surfaceParams = new LayoutParams(LayoutParams.MATCH_PARENT, (int)(getResources().getDisplayMetrics().widthPixels*aspectRatio));
cameraPreview.setLayoutParams(surfaceParams);
}
cameraPreview.setCamera(camera);
//Ajout de l'aperçu au conteneur
previewHolder.addView(cameraPreview);
Ensuite, dans la vue de surface, je définis les paramètres de la caméra à afficher
public void setCamera(Camera camera) {
if (mCamera == camera) { return; }
mCamera = camera;
if (mCamera != null) {
requestLayout();
try {
mCamera.setPreviewDisplay(mHolder);
} catch (IOException e) {
e.printStackTrace();
}
if(mCamera != null){
//Définition du rapport hauteur/largeur de la caméra
Camera.Parameters parameters = mCamera.getParameters();
List sizes = parameters.getSupportedPreviewSizes();
Size optimalSize = getOptimalPreviewSize(sizes, getResources().getDisplayMetrics().widthPixels, getResources().getDisplayMetrics().heightPixels);
parameters.setPreviewSize(optimalSize.width, optimalSize.height);
mCamera.setParameters(parameters);
}
/*
Important : Appelez startPreview() pour commencer à mettre à jour la surface de prévisualisation. La prévisualisation doit
être démarrée avant de pouvoir prendre une photo.
*/
mCamera.startPreview();
}
}
Vous pouvez voir que l'homme LEGO devient plus grand et plus mince lorsque le téléphone est tourné :
Comment puis-je m'assurer que le rapport hauteur/largeur de ma vue de caméra est correct ?