Vin*_*noy 26 android android-camera
我正在开发一款具有自定义相机屏幕的应用程序,我应该实现自拍对焦,就像Android(更具体地说,Galaxy S4)相机应用程序一样.
我已尝试使用此处列出的步骤,但似乎没有引起任何明显的聚焦.对焦模式设置为连续图片(我们仅支持特定设备).
当用户点击相机预览时,我需要关注图像的上半部分.为此,我使用代码片段
Parameters parameters = mCamera.getParameters();
if (parameters.getMaxNumFocusAreas() > 0) {
ArrayList<Area> focusAreas = new ArrayList<Camera.Area>(1);
focusAreas.add(new Area(new Rect(-1000, -1000, 1000, 0), 750));
parameters.setFocusAreas(focusAreas);
mCamera.setParameters(parameters);
}
Run Code Online (Sandbox Code Playgroud)
我不想要自动聚焦,因为聚焦图像需要很长时间.我只对图像的上半部分感兴趣.有没有人成功实现Tap to Focus和连续图片模式?
Dud*_*ude 25
最近陷入了这个问题.正如MatheusJardimB所说,这个问题 有很多帮助.
但是,在我的情况下,我想在ContinuousPicture模式下启动然后能够点击聚焦然后继续该ContinuousPicture模式.
我设法通过使用的onAutoFocus方法让它工作Camera.AutoFocusCallback().我不确定它是最好还是最漂亮的方式,但它似乎有效.
这是代码:
setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (mCamera != null) {
Camera camera = mCamera.getCamera();
camera.cancelAutoFocus();
Rect focusRect = calculateTapArea(event.getX(), event.getY(), 1f);
Parameters parameters = camera.getParameters();
parameters.setFocusMode(Parameters.FOCUS_MODE_MACRO);
if (parameters.getMaxNumFocusAreas() > 0) {
List<Area> mylist = new ArrayList<Area>();
mylist.add(new Camera.Area(focusRect, 1000));
parameters.setFocusAreas(mylist);
}
camera.setParameters(parameters);
camera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
camera.cancelAutoFocus();
Parameters params = camera.getParameters();
if (!params.getFocusMode().equals(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
camera.setParameters(params);
}
}
});
}
return true;
}
return false;
});
Run Code Online (Sandbox Code Playgroud)
您可以将焦点区域更改为
ArrayList<Area> focusAreas = new ArrayList<Camera.Area>(1);
focusAreas.add(new Area(new Rect(-1000, -1000, 1000, 0), 750));
Run Code Online (Sandbox Code Playgroud)
它应该工作.
UPDATE
我最近收购了三星S5并对其进行了测试.它没有那么好用,所以我添加了一些修改,它现在正在工作.这也在Galaxy S6和Galaxy Note4上成功测试过.
这是修改后的代码:
setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (mCamera != null) {
Camera camera = mCamera.getCamera();
camera.cancelAutoFocus();
Rect focusRect = calculateTapArea(event.getX(), event.getY(), 1f);
Parameters parameters = camera.getParameters();
if (parameters.getFocusMode().equals(
Camera.Parameters.FOCUS_MODE_AUTO) {
parameters.setFocusMode(Parameters.FOCUS_MODE_AUTO);
}
if (parameters.getMaxNumFocusAreas() > 0) {
List<Area> mylist = new ArrayList<Area>();
mylist.add(new Camera.Area(focusRect, 1000));
parameters.setFocusAreas(mylist);
}
try {
camera.cancelAutoFocus();
camera.setParameters(parameters);
camera.startPreview();
camera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (!camera.getParameters().getFocusMode().equals(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
Parameters parameters = camera.getParameters();
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
if (parameters.getMaxNumFocusAreas() > 0) {
parameters.setFocusAreas(null);
}
camera.setParameters(parameters);
camera.startPreview();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
ahm*_*_89 18
这有解决方案.我刚刚在他的代码中添加了一些缺少方法的实现.
private static final int FOCUS_AREA_SIZE= 300;
Run Code Online (Sandbox Code Playgroud)
//
mCameraPreview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
focusOnTouch(event);
}
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
//
private void focusOnTouch(MotionEvent event) {
if (mCamera != null ) {
Camera.Parameters parameters = mCamera.getParameters();
if (parameters.getMaxNumMeteringAreas() > 0){
Log.i(TAG,"fancy !");
Rect rect = calculateFocusArea(event.getX(), event.getY());
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();
meteringAreas.add(new Camera.Area(rect, 800));
parameters.setFocusAreas(meteringAreas);
mCamera.setParameters(parameters);
mCamera.autoFocus(mAutoFocusTakePictureCallback);
}else {
mCamera.autoFocus(mAutoFocusTakePictureCallback);
}
}
}
private Rect calculateFocusArea(float x, float y) {
int left = clamp(Float.valueOf((x / mCameraPreview.getWidth()) * 2000 - 1000).intValue(), FOCUS_AREA_SIZE);
int top = clamp(Float.valueOf((y / mCameraPreview.getHeight()) * 2000 - 1000).intValue(), FOCUS_AREA_SIZE);
return new Rect(left, top, left + FOCUS_AREA_SIZE, top + FOCUS_AREA_SIZE);
}
private int clamp(int touchCoordinateInCameraReper, int focusAreaSize) {
int result;
if (Math.abs(touchCoordinateInCameraReper)+focusAreaSize/2>1000){
if (touchCoordinateInCameraReper>0){
result = 1000 - focusAreaSize/2;
} else {
result = -1000 + focusAreaSize/2;
}
} else{
result = touchCoordinateInCameraReper - focusAreaSize/2;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
//实现此回调以触发焦点.
private Camera.AutoFocusCallback mAutoFocusTakePictureCallback = new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
// do something...
Log.i("tap_to_focus","success!");
} else {
// do something...
Log.i("tap_to_focus","fail!");
}
}
};
Run Code Online (Sandbox Code Playgroud)
Grz*_* D. -1
我有同样的问题。我已经在许多设备和许多 Android 版本上检查过这一点。
看来焦点区域在 CONTINUOUS focus-mode 下不起作用。
我的解决方法是将对焦模式设置为自动或宏以及设置对焦区域:
params.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
params.setFocusAreas(focusAreas);
mCamera.setParameters(params);
Run Code Online (Sandbox Code Playgroud)
请注意,Galaxy S3 和 S4 上的内置相机应用程序的工作方式相同:它永久处于连续模式。当您触摸屏幕时,它会切换到自动并设置对焦区域。但过了一会儿,它又回到连续模式,焦点区域又回到屏幕中央。
我希望这对你有所帮助。