Android 什么';这是实现相机点击对焦的正确方法吗?
我正在开发一个应用程序,它有一个定制的摄像头屏幕,我应该为它实现点击对焦,比如Android(更具体地说,Galaxy S4)摄像头应用程序 我尝试过使用概述的步骤,但似乎没有引起任何明显的聚焦。焦点模式设置为连续图片(我们仅支持特定设备) 当用户点击相机预览时,我需要聚焦在图像的上半部分。为此,我使用代码段Android 什么';这是实现相机点击对焦的正确方法吗?,android,android-camera,Android,Android Camera,我正在开发一个应用程序,它有一个定制的摄像头屏幕,我应该为它实现点击对焦,比如Android(更具体地说,Galaxy S4)摄像头应用程序 我尝试过使用概述的步骤,但似乎没有引起任何明显的聚焦。焦点模式设置为连续图片(我们仅支持特定设备) 当用户点击相机预览时,我需要聚焦在图像的上半部分。为此,我使用代码段 Parameters parameters = mCamera.getParameters(); if (parameters.getMaxNumFocusAreas() > 0)
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);
}
Parameters=mCamera.getParameters();
if(parameters.getMaxNumFocusAreas()>0){
ArrayList focusAreas=新的ArrayList(1);
添加(新区域(新矩形(-1000,-1000,1000,0),750));
参数setFocusAreas(focusAreas);
mCamera.setParameters(参数);
}
我不想自动对焦,因为它需要太长的时间来集中在图像上。我只对图片的上半部分感兴趣。有人成功地实现了连续图片模式下的点击对焦吗?我也有同样的问题。
我已经在许多设备和许多Android版本上检查过这一点
看起来,聚焦区域在连续聚焦模式下不工作
我的解决方法是将焦点模式设置为自动或宏,同时设置焦点区域:
params.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
params.setFocusAreas(focusAreas);
mCamera.setParameters(params);
请注意,Galaxy S3和S4上的stock Camera应用程序的工作方式相同:它始终处于连续模式。当您触摸屏幕时,它将切换到自动并设置焦点区域。但过了一段时间,它又回到了连续模式,焦点区域又回到了屏幕中央
我希望这能对你有所帮助。最近碰到了这个问题。正如Matheusjarimb所说,这很有帮助 然而,在我的例子中,我想从
ContinuousPicture
模式开始,然后能够点击对焦,然后继续使用ContinuousPicture
模式
我通过使用Camera.AutoFocusCallback()
的onAutoFocus
方法成功地使它工作。我不确定这是最好的还是最漂亮的方法,但它似乎有效
代码如下:
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;
});
setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
if(mCamera!=null){
Camera-Camera=mCamera.getCamera();
camera.cancelAutoFocus();
Rect focusRect=CalculateParea(event.getX(),event.getY(),1f);
Parameters=camera.getParameters();
parameters.setFocusMode(parameters.FOCUS\u MODE\u宏);
if(parameters.getMaxNumFocusAreas()>0){
List mylist=new ArrayList();
添加(新的摄像头区域(focusRect,1000));
参数setFocusAreas(mylist);
}
设置参数(参数);
camera.autoFocus(新camera.AutoFocusCallback(){
@凌驾
自动对焦上的公共空白(布尔成功,摄像头){
camera.cancelAutoFocus();
Parameters params=camera.getParameters();
如果(!params.getFocusMode().equals(Camera.Parameters.FOCUS\u MODE\u CONTINUOUS\u PICTURE)){
参数设置聚焦模式(相机参数聚焦模式连续图像);
摄像机。设置参数(参数);
}
}
});
}
返回true;
}
返回false;
});
您可以将焦点区域更改为
ArrayList<Area> focusAreas = new ArrayList<Camera.Area>(1);
focusAreas.add(new Area(new Rect(-1000, -1000, 1000, 0), 750));
ArrayList focusAreas=新的ArrayList(1);
添加(新区域(新矩形(-1000,-1000,1000,0),750));
它应该会起作用
更新
我最近买了一台三星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;
}
});
setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
if(mCamera!=null){
Camera-Camera=mCamera.getCamera();
camera.cancelAutoFocus();
Rect focusRect=CalculateParea(event.getX(),event.getY(),1f);
Parameters=camera.getParameters();
if(parameters.getFocusMode().equals(
相机。参数。对焦(自动模式){
parameters.setFocusMode(parameters.FOCUS\u MODE\u AUTO);
}
if(parameters.getMaxNumFocusAreas()>0){
List mylist=new ArrayList();
添加(新的摄像头区域(focusRect,1000));
参数setFocusAreas(mylist);
}
试一试{
camera.cancelAutoFocus();
设置参数(参数);
camera.startPreview();
camera.autoFocus(新camera.AutoFocusCallback(){
@凌驾
自动对焦上的公共空白(布尔成功,摄像头){
如果(!camera.getParameters().getFocusMode().equals(camera.Parameters.FOCUS\u MODE\u CONTINUOUS\u PICTURE)){
Parameters=camera.getParameters();
parameters.setFocusMode(相机.参数.聚焦模式\u连续图像);
if(parameters.getMaxNumFocusAreas()>0){
参数setFocusAreas(null);
}
设置参数(参数);
camera.startPreview();
}
}
});
}捕获(例外e){
e、 印刷品
private static final int FOCUS_AREA_SIZE= 300;
mCameraPreview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
focusOnTouch(event);
}
return true;
}
});
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;
}
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!");
}
}
};
binding.cPreview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCamera.autoFocus(myAutoFocusCallback);
}
});
Camera.AutoFocusCallback myAutoFocusCallback = new Camera.AutoFocusCallback(){
@Override
public void onAutoFocus(boolean arg0, Camera arg1) {
// TODO Auto-generated method stub
}};