Android 自定义Camera_github


地址:​​https://github.com/danfengfirst/Camera​

Demo说明:

1、Demo包含了自定义的矩形View ,一般这种矩形放个图片就可以了,这里因为对长宽比有特别的需求,希望在不同屏幕保持相同的长宽比,因此这里进行了自定义,自定义部分可以换成图片。另外,这个Demo并不是只拍摄矩形区域。

2、Demo中将Camera直接放到了自定义的SurfaceView中。

3、触摸聚焦

//设置触摸事件监听
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Point point = new Point();
point.x = (int) event.getX();
point.y = (int) event.getY();
onFocus(point, mCameraAutoFocusCallBack);
}
return true;
}
});

//触摸对焦
protected boolean onFocus(Point point, Camera.AutoFocusCallback callback) {
if (mCamera == null) {
return false;
}
Camera.Parameters parameters = null;
try {
parameters = mCamera.getParameters();
} catch (Exception e) {
e.printStackTrace();
return false;
}
//不支持设置自定义聚焦,则使用自动聚焦,返回

if(Build.VERSION.SDK_INT >= 14) {

if (parameters.getMaxNumFocusAreas() <= 0) {
return focus(callback);
}

Log.i(TAG, "onCameraFocus:" + point.x + "," + point.y);

//定点对焦
List<Camera.Area> areas = new ArrayList<Camera.Area>();
int left = point.x - 300;
int top = point.y - 300;
int right = point.x + 300;
int bottom = point.y + 300;
left = left < -1000 ? -1000 : left;
top = top < -1000 ? -1000 : top;
right = right > 1000 ? 1000 : right;
bottom = bottom > 1000 ? 1000 : bottom;
areas.add(new Camera.Area(new Rect(left, top, right, bottom), 100));
parameters.setFocusAreas(areas);
try {
//使用的小米手机在设置聚焦区域的时候经常会出异常,看日志发现是框架层的字符串转int的时候出错了,
//目测是小米修改了框架层代码导致,在此try掉,对实际聚焦效果没影响
mCamera.setParameters(parameters);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return false;
}
}


return focus(callback);
}

private boolean focus(Camera.AutoFocusCallback callback) {
try {
mCamera.autoFocus(callback);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}

4、最佳分辨率

/**
* 获取最佳分辨率
* @param sizes
* @param w
* @param h
* @return
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

5、图片尺寸过小之类的问题可以通过重新构建bitmap来解决

关于自定义camera的文章网上也比较多就不多介绍了

ps:随便记一下github图片的显示方式,怕自己下次忘了

image](https://github.com/danfengfirst/Camera/raw/master/Screenshot_2018-02-03-11-53-57.png)