Ответ 1
UPD: Извините, но после того, как я переписал свой дерьмовый код, ключом является слишком маленький размер предварительного просмотра, который вызвал "размытость", поэтому вы должны установить разумный размер предварительного просмотра, а не причину зачеркивания ниже, но рекомендуется автофокус...
Size size = getBestSupportSize(parameters.getSupportedPreviewSizes(), width, height);
parameters.setPreviewSize(size.width, size.height);
Что касается метода getBestSupportSize()
, как получить bestSize
для ваших потребностей проекта, в этом случае он равен ширине экрана и его соотношению 4/3, может быть и другим, я вычисляю соотношение деления width/height
,
private Size getBestSupportSize(List<Size> sizes, int width, int height) {
Size bestsize = sizes.get(0);
int screenWidth = getResources().getDisplayMetrics().widthPixels;
int dt = Integer.MAX_VALUE;
for (int i = sizes.size() - 1; i >= 0; i--) {
Log.d(TAG, "-index : " + i);
Size s = sizes.get(i);
if (s.width * 3.0f / 4 == s.height) {
int newDT = Math.abs(screenWidth - s.width);
if (newDT < dt && screenWidth < s.width) {
dt = newDT;
bestsize = s;
}
}
}
return bestsize;//note that if no "4/3" size supported,default return size[0]
}
Так что эта "нечеткость" была вызвана небольшим previewSize, вычисляющим лучший размер для камеры, используя этот getSupportedPreviewSizes()
И я буду держать фрагмент autoFocus
ниже, зачеркнут, хотя, если нужно, БЮР.
Ну, я получил решение для этой "нечеткой" проблемы, и в моем случае я просто использую TextureView
и surfaceTexture
чтобы сделать снимок вместо старого surfaceView
с surfaceHolder
.
Ключ устанавливается в этом mCamera.autofocus()
, поэтому картинка "нечеткая", потому что у нас нет этой настройки автофокуса. как ниже:
mCamera.setPreviewTexture(surface);
//enable autoFocus if moving
mCamera.setAutoFocusMoveCallback(new AutoFocusMoveCallback() {
@Override
public void onAutoFocusMoving(boolean start, Camera camera) {
if (start) { //true means you are moving the camera
mCamera.autoFocus(myAutoFocus);
}
}
});
mCamera.startPreview();
autoFocusCallback
как это:
AutoFocusCallback myAutoFocus = new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
}
};