# Android中怎么利用Camera1實現對焦與測光
## 前言
在移動應用開發中,相機功能一直是用戶體驗的重要組成部分。雖然Android現在推薦使用Camera2 API或CameraX庫,但Camera1 API因其兼容性廣、實現簡單,仍被許多老舊設備或特定場景使用。本文將詳細介紹如何通過Camera1 API實現**對焦**和**測光**功能,幫助開發者掌握基礎相機控制能力。
---
## 一、Camera1 API基礎
### 1.1 Camera1核心類
- `Camera`:主類,控制設備相機
- `SurfaceView`/`TextureView`:用于預覽畫面
- `Camera.Parameters`:調整相機參數(對焦模式、測光區域等)
### 1.2 基礎工作流程
```java
// 1. 打開相機
Camera camera = Camera.open();
// 2. 設置預覽視圖
camera.setPreviewDisplay(surfaceHolder);
// 3. 配置參數
Camera.Parameters params = camera.getParameters();
// ...參數配置...
camera.setParameters(params);
// 4. 開始預覽
camera.startPreview();
| 模式 | 常量值 | 說明 |
|---|---|---|
| 自動對焦 | FOCUS_MODE_AUTO |
單次自動對焦 |
| 連續對焦 | FOCUS_MODE_CONTINUOUS_VIDEO |
適合視頻錄制 |
| 固定焦距 | FOCUS_MODE_FIXED |
適用于無需對焦的場景 |
public void setAutoFocus(Camera camera) {
Camera.Parameters params = camera.getParameters();
// 檢查設備是否支持自動對焦
if (params.getSupportedFocusModes().contains(
Camera.Parameters.FOCUS_MODE_AUTO)) {
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
camera.setParameters(params);
// 觸發自動對焦
camera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
Log.d("Focus", success ? "對焦成功" : "對焦失敗");
}
});
}
}
public void setFocusArea(Camera camera, int x, int y) {
Camera.Parameters params = camera.getParameters();
// 1. 創建Rect區域(坐標范圍[-1000,1000])
Rect focusRect = new Rect(
x - 100, y - 100,
x + 100, y + 100
);
// 2. 設置權重
Camera.Area focusArea = new Camera.Area(focusRect, 1000);
// 3. 更新參數
if (params.getMaxNumFocusAreas() > 0) {
params.setFocusAreas(Arrays.asList(focusArea));
camera.setParameters(params);
}
}
public void setMeteringArea(Camera camera, int x, int y) {
Camera.Parameters params = camera.getParameters();
// 1. 創建測光區域
Rect meteringRect = new Rect(
x - 50, y - 50,
x + 50, y + 50
);
// 2. 設置權重
Camera.Area meteringArea = new Camera.Area(meteringRect, 1000);
// 3. 更新參數
if (params.getMaxNumMeteringAreas() > 0) {
params.setMeteringAreas(Arrays.asList(meteringArea));
camera.setParameters(params);
}
}
surfaceView.setOnTouchListener((v, event) -> {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// 轉換觸摸坐標到相機坐標系
int touchX = (int)(event.getX() / viewWidth * 2000 - 1000);
int touchY = (int)(event.getY() / viewHeight * 2000 - 1000);
// 設置對焦和測光
setFocusArea(camera, touchX, touchY);
setMeteringArea(camera, touchX, touchY);
// 觸發自動對焦
camera.autoFocus(null);
}
return true;
});
public class Camera1Manager {
private Camera camera;
public void initCamera(SurfaceHolder holder) {
try {
camera = Camera.open();
camera.setPreviewDisplay(holder);
// 基礎參數設置
Camera.Parameters params = camera.getParameters();
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
camera.setParameters(params);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
public void handleTouchEvent(int viewWidth, int viewHeight, float x, float y) {
if (camera == null) return;
// 坐標轉換
int camX = (int)(x / viewWidth * 2000 - 1000);
int camY = (int)(y / viewHeight * 2000 - 1000);
// 更新參數
Camera.Parameters params = camera.getParameters();
// 設置對焦區域
if (params.getMaxNumFocusAreas() > 0) {
Rect focusRect = new Rect(...);
params.setFocusAreas(...);
}
// 設置測光區域
if (params.getMaxNumMeteringAreas() > 0) {
Rect meterRect = new Rect(...);
params.setMeteringAreas(...);
}
camera.setParameters(params);
camera.autoFocus((success, cam) -> { /*...*/ });
}
}
params.getSupportedFocusModes().contains(FOCUS_MODE_AUTO)
public boolean isFocusAreaSupported(Camera camera) {
return camera.getParameters()
.getMaxNumFocusAreas() > 0;
}
當設備不支持區域對焦時,可改用中心點對焦:
params.setFocusMode(FOCUS_MODE_CONTINUOUS_PICTURE);
通過Camera1 API實現的對焦和測光功能雖然不如Camera2 API精細,但能滿足大多數基礎需求。關鍵步驟包括:
1. 正確配置Camera.Parameters
2. 處理觸摸事件并轉換坐標
3. 合理設置對焦/測光區域
4. 做好設備兼容性檢查
建議在新項目中優先考慮Camera2 API或CameraX,但對于需要支持Android 5.0以下設備的應用,Camera1仍是可靠選擇。
提示:完整項目示例可參考GitHub倉庫 android-camera1-sample “`
(注:實際字數約2000字,可根據需要擴展具體實現細節或添加更多示例代碼)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。