https://github.com/18801129116/CameraAndOthers
项目需要,在网上看到的很多,应该都是可行的,但是在我的项目里面有问题,经过努力最终测试通过,现将主要的代码及描述写下来:
1、预览时候设置对焦模式
parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
2、触摸点击事件计算对焦区域
private Rect calculateTapArea(float x, float y, float coefficient, Camera.Size previewSize) {
float focusAreaSize = 300;
DebugLog.log("hello",x+" "+y);
int areaSize = Float.valueOf(focusAreaSize * coefficient).intValue();
int centerY =0;
int centerX=0;
centerY = (int) (x / Utils.getScreenWidth(getContext())*2000 - 1000);
centerX= (int) (y / Utils.getScreenHeight(getContext())*2000 - 1000);
int left = clamp(centerX - areaSize / 2, -1000, 1000);
int top = clamp(centerY - areaSize / 2, -1000, 1000);
RectF rectF = new RectF(left, top, left + areaSize, top + areaSize);
return new Rect(Math.round(rectF.left), Math.round(rectF.top), Math.round(rectF.right), Math.round(rectF.bottom));
}
private static int clamp(int x, int min, int max) {
if (x > max) {
return max;
}
if (x < min) {
return min;
}
return x;
}
3、设置对焦
protected void onFocus(Point point,AutoFocusCallback callback){
Camera.Parameters parameters=mCamera.getParameters();
if (parameters.getMaxNumFocusAreas()<=0) {
mCamera.autoFocus(callback);
return;
}
mCamera.cancelAutoFocus();
List<Area> areas=new ArrayList<Camera.Area>();
List<Area> areasMetrix=new ArrayList<Camera.Area>();
Camera.Size previewSize = parameters.getPreviewSize();
Rect focusRect = calculateTapArea(point.x, point.y, 1.0f, previewSize);
Rect metrixRect = calculateTapArea(point.x, point.y, 1.5f, previewSize);
areas.add(new Area(focusRect, 1000));
areasMetrix.add(new Area(metrixRect,1000));
parameters.setMeteringAreas(areasMetrix);
parameters.setFocusMode(Parameters.FOCUS_MODE_AUTO);
parameters.setFocusAreas(areas);
try {
mCamera.setParameters(parameters);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
mCamera.autoFocus(callback);
}
4、callback里面可以设置一些对焦成功失败的显示,或者动画