水印相机是自定义相机的一种,实现方法有很多,我看了很多别人的做的很漂亮,我做的就很普通了,不过总算是实现了拍照加水印的功能。
我这边用到了SurfaceView
,有人没用这个也做出来水印相机,个人觉得还是SurfaceView
更方便一点(不接受反驳)。
先看看效果:
原图太大,我做了压缩,所以动图显得模糊。
第一步,我们想一进入就打开相机预览,这个怎么做呢?
相机功能由android.hardware.Camera
类实现,但是需要有一个预览载体,这里就用SurfaceView
,而且需要辅助类SurfaceHolder
,首先,我们的 Activity 要实现SurfaceHolder.Callback
接口:
public class WaterCameraActivity extends AppCompatActivity implements SurfaceHolder.Callback
第二步,关联SurfaceHolder
:
private SurfaceView mSv;
private SurfaceHolder mSurfaceHolder;
mSurfaceHolder = mSv.getHolder();
mSurfaceHolder.setKeepScreenOn(true);
mSurfaceHolder.setFormat(PixelFormat.TRANSPARENT);
mSurfaceHolder.addCallback(this);
// 为了实现照片预览功能,需要将SurfaceHolder的类型设置为PUSH,这样画图缓存就由Camera类来管理,画图缓存是独立于Surface的
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
实现SurfaceHolder.Callback
接口有三个方法需要重写:
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
只要SurfaceView
显示,就会调用surfaceCreated()
,不显示就会调用surfaceDestroyed()
。因此可以在surfaceCreated()
中初始化相机,并展示预览界面;在surfaceDestroyed()
中释放相机资源。
第三步,初始化相机
mCamera = Camera.open(0);//0-后摄像头,1-前摄像头
Camera.getCameraInfo(0, cameraInfo);
Camera.Parameters parameters = mCamera.getParameters();
// 设置图片格式
parameters.setPictureFormat(ImageFormat.JPEG);
// 设置照片质量
parameters.setJpegQuality(100);
// 首先获取系统设备支持的所有颜色特效,如果设备不支持颜色特性将返回一个null, 如果有符合我们的则设置
List<String> colorEffects = parameters.getSupportedColorEffects();
Iterator<String> colorItor = colorEffects.iterator();
while (colorItor.hasNext()) {
String currColor = colorItor.next();
if (currColor.equals(Camera.Parameters.EFFECT_SOLARIZE)) {
parameters.setColorEffect(Camera.Parameters.EFFECT_AQUA);
break;
}
}
// 获取对焦模式
List<String> focusModes