Devi limitare le dimensioni dell'anteprima in base a (1) dimensioni di anteprima disponibili (2) la tua vista. Ecco la mia soluzione se ne hai ancora bisogno:
private class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraPreview(Context context, Camera camera) {
super(context);
mCamera = camera;
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
// deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
private void startPreview() {
try {
/**
* Orientation should be adjusted, see http://stackoverflow.com/questions/20064793/how-to-fix-camera-orientation/26979987#26979987
*/
Camera.Parameters parameters = mCamera.getParameters();
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
Camera.Size previewSize = null;
float closestRatio = Float.MAX_VALUE;
int targetPreviewWidth = isLandscape() ? getWidth() : getHeight();
int targetPreviewHeight = isLandscape() ? getHeight() : getWidth();
float targetRatio = targetPreviewWidth/(float) targetPreviewHeight;
Log.v(TAG, "target size: " + targetPreviewWidth + "/" + targetPreviewHeight + " ratio:" + targetRatio);
for (Camera.Size candidateSize : previewSizes) {
float whRatio = candidateSize.width/(float) candidateSize.height;
if (previewSize == null || Math.abs(targetRatio - whRatio) < Math.abs(targetRatio - closestRatio)) {
closestRatio = whRatio;
previewSize = candidateSize;
}
}
Log.v(TAG, "preview size: " + previewSize.width + "/" + previewSize.height);
parameters.setPreviewSize(previewSize.width, previewSize.height);
mCamera.setParameters(parameters);
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (IOException e) {
Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
}
}
fonte
2014-11-10 16:09:25
Per impostare le dimensioni anteprima Sto usando seguente codice, ma ancora superficie appare allungato: private Camera.Size getBestPreviewSize (int width, int altezza, \t \t \t Camera.Parameters parametri) { \t \t Camera.Size result = null; \t \t per (dimensione Camera.Size: parameters.getSupportedPreviewSizes()) { \t \t \t se (size.width <= larghezza && size.height <= altezza) { \t \t \t \t se (risultato == null) { \t \t \t \t \t risultato = dimensione; \t \t \t \t} else { \t \t \t \t \t int resultarea = result.width * result.height; \t \t \t \t \t int newArea = size.width * dimensioni.altezza; \t \t \t \t \t se (newArea> resultarea) { \t \t \t \t \t \t result = dimensioni; \t \t \t \t \t} \t \t \t \t} \t \t \t} \t \t} \t \t ritorno (risultato); \t} – Manjeet
Perché lo stai facendo in questo modo? cerca prima una semplice corrispondenza esatta. Sembra che tu stia copiando codice molto vecchio da Barcode Scanner. –