android - que - modo retrato instagram no aparece
Android zxing-vista previa de la cámara de retrato/vista de frente se estira/deforma (5)
He logrado usar la respuesta aquí para girar la vista previa de la cámara a retrato: http://code.google.com/p/zxing/issues/detail?id=178#c46
sin embargo, la vista previa en sí misma está estirada / deformada: la altura parece estar estirándose para llenar el cuadro (pero puede ser que el ancho sea demasiado grande para la pantalla y se esté aplastando para que quepa)
¿Hay alguna forma de "envolver" el contenido en lugar de estirarlo para que se ajuste a la vista de la superficie?
EDITAR: Lo ordené modificando el método ''findBestPreviewSizeValue'' en el ''CameraConfigurationManager'' e invirtiendo los puntos X e Y (gracias a Sean Owen por el puntero a continuación). Aquí está el código:
private static Point findBestPreviewSizeValue(CharSequence previewSizeValueString,
Point screenResolution) {
int bestX = 0;
int bestY = 0;
int diff = Integer.MAX_VALUE;
for (String previewSize : COMMA_PATTERN.split(previewSizeValueString)) {
previewSize = previewSize.trim();
int dimPosition = previewSize.indexOf(''x'');
if (dimPosition < 0) {
Log.w(TAG, "Bad preview-size: " + previewSize);
continue;
}
int newX;
int newY;
try {
newY = Integer.parseInt(previewSize.substring(0, dimPosition));
newX = Integer.parseInt(previewSize.substring(dimPosition + 1));
//original:
//newX = Integer.parseInt(previewSize.substring(0, dimPosition));
//newY = Integer.parseInt(previewSize.substring(dimPosition + 1));
} catch (NumberFormatException nfe) {
Log.w(TAG, "Bad preview-size: " + previewSize);
continue;
}
int newDiff = Math.abs(newX - screenResolution.x) + Math.abs(newY - screenResolution.y);
if (newDiff == 0) {
bestX = newY;
bestY = newX;
//original:
//bestX = newX;
//bestY = newY;
break;
} else if (newDiff < diff) {
bestX = newY;
bestY = newX;
//original:
//bestX = newX;
//bestY = newY;
diff = newDiff;
}
}
if (bestX > 0 && bestY > 0) {
return new Point(bestX, bestY);
}
return null;
}
Debe hacer un poco más para que esto funcione, en lugar de configurar la vista previa en modo retrato. Por ejemplo, debe elegir un tamaño de vista previa apropiado ahora que está en vertical, no horizontal.
¿Envolver seguramente no es deseable? No, no puedes hacerlo envolver; siempre arrojará toda la imagen de vista previa en SurfaceView
, extendiéndose si es necesario. Supongo que podrías volver a implementar mucho de ese código para hacer algo diferente, pero sería bastante difícil.
El motivo de la deformación puede ser que la relación de aspecto de la vista previa de la cámara no coincida con la relación de aspecto de la pantalla.
La mayoría de la relación de aspecto de la pantalla del teléfono móvil es 4: 3, como 2560x1440, 1920x1080 y así sucesivamente. Cuando utiliza el parámetro.setPreviewSize (ancho, alto) para configurar la dimensión de vista previa de la cámara, si el valor de alto: ancho no es igual a la relación de aspecto de la pantalla de su teléfono, la imagen de la cámara se deformará para llenar la pantalla.
Logré que esto funcionara cambiando el código debajo de CameraConfigurationManager.java
:
float screenAspectRatio = (float) screenResolution.x / (float) screenResolution.y;
A:
float screenAspectRatio = (float) screenResolution.y / (float) screenResolution.x;
Y
float aspectRatio = (float) maybeFlippedWidth / (float) maybeFlippedHeight;
A:
float aspectRatio = (float) maybeFlippedHeight / (float) maybeFlippedWidth;
Hice esto junto con este post: Cámara Zxing en modo retrato en Android
Espero que esto ayude a los demás.
Puede obtener el tamaño de Priview por esta función:
Lista privada mSupportedPreviewSizes = parameters.getSupportedPreviewSizes ();
if (mSupportedPreviewSizes != null) {
mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
}
private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) h / w;
if (sizes == null)
return null;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
for (Camera.Size size : sizes) {
double ratio = (double) size.height / size.width;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
float ratio;
if (mPreviewSize.height >= mPreviewSize.width)
ratio = (float) mPreviewSize.height / (float) mPreviewSize.width;
else
ratio = (float) mPreviewSize.width / (float) mPreviewSize.height;
after getting ratio set your size in
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension((int) (width * ratio), height);
}
Tuve el mismo problema pero pude resolverlo invirtiendo la relación de aspecto en el archivo CameraConfigurationManager.java dentro de findBestPreviewSizeValue cambiando esto
float screenAspectRatio = (float) screenResolution.x / (float) screenResolution.y;
a esto
float screenAspectRatio = (float) screenResolution.y / (float) screenResolution.x;
Encontré la solución aquí.