功能设计
camera不仅需要有基础的拍照功能,还需要对拍摄的照片进行一系列处理,包括但不仅限于图片抗扭曲,曝光度,聚焦等。
- 相机预览功能
- 拍照的偏好设置,如闪光灯,聚焦,曝光补偿
- 相机可随设备旋转,拍摄横屏和竖屏的照片
- 拍照后保存在手机的pictures文件夹
- 可以预览拍摄的照片
- 图片抗扭曲处理
界面设计
初稿由负责视觉的李同学进行设计,在后续的编程过程中会有些许修改
相机预览
这里我们需要一个CameraPreview.java类
SurfaceView是一个包含有Surface的View,而Surface用来处理直接呈现在屏幕上的内容
成员变量mHolder保存这个Surface的“持有者”,而只有Holder才能对对应的Surface进行修改
成员变量mCamera保存相机Camera的实例
对于SurfaceView来说,这个View创建时就会创建Surface,而当Surface创建时就会触发surfaceCreated(),所以我们就要在surfaceCreated()中打开相机、开始预览,并将预览帧交给Surface处理。getCameraInstance()是一个获取并打开相机的方法。Camera的setPreviewDisplay()方法就是告知将预览帧数据交给谁,这里当然就是这个Surface的Holder了。最后用startPreview()开启相机。
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private static final String TAG = "CameraPreview";
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraPreview(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
}
private static Camera getCameraInstance() {
Camera c = null;
try {
c = Camera.open();
} catch (Exception e) {
Log.d(TAG, "camera is not available");
}
return c;
}
public void surfaceCreated(SurfaceHolder holder) {
mCamera = getCameraInstance();
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
mHolder.removeCallback(this);
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
}
}
还需要在AndroidManifest中申请和声明相机
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
拍照设置
主要想做的设置是聚焦,曝光补偿和闪光灯,现在新建preferences.xml来添加条目
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:defaultValue="auto"
android:key="flash_mode"
android:title="闪光灯" />
<ListPreference
android:key="focus_mode"
android:title="对焦模式" />
<ListPreference
android:defaultValue="0"
android:key="exposure_compensation"
android:title="曝光补偿" />
</PreferenceScreen>
使用Android推荐的PreferenceFragment作为相机偏好设置的菜单。PreferenceFragment继承自Fragment,我们只用向其添加设置的内容,而不用关心具体设置参数用户交互设计等繁琐的内容。
新建SettingsFragment类:
public class SettingsFragment