android 自定义相机

周五下班前被一个大一学生给问住了,怎么搞一个相机可以在取景框随便写画,点击拍照保存图片。
周末研究了一下,遇到以下几个问题记录一下。
首先说明一下 我的预览View 使用surfaceview,手画view也是surfaceview。
1、surfaceview 与Camera的绑定。
2、两个surfaceview覆盖存在问题,会出现后者不显示。
3、两个view的内容怎么合并。
4、照片的像素比列不协调。
线上一个效果图:
这里写图片描述
1、网上的答案太多了,也很简单,就不说了。
2、两个surfaceview覆盖,因为surfaceview 跟别的view本质上有区别。
surfaceview的显示隐藏也要触及到window级别。
mSurfaceHolder.setFormat(PixelFormat.TRANSPARENT);// 让这个surfaceview的所在window 变成透明
setZOrderMediaOverlay(true);// 让这个surfaceview 放到顶部
3、两个view合并问题
Canvas canvas = new Canvas(bitPhoto);
Path mPath = mPalette.getPath();
Paint mpaint = new Paint();
mpaint.setStyle(Paint.Style.STROKE);
mpaint.setStrokeWidth(50);
mpaint.setColor(Color.RED);
canvas.drawPath(mPath, mpaint);
这里说明一下path是在手画的view中传过来的,使用photo的bitmap创建画布对象,拍照时在根据path在photo上绘制一遍。
4、照片的像素比列不协调
会发现在预览的时候没问题,但是生成照片之后发现手写的图案跟预览时位置不一致,分析找到原因,这是由于照相时设置的照片像素导致的。
Camera.Parameters parameters = mCamera.getParameters();
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
parameters.setPictureFormat(ImageFormat.JPEG);
parameters.setPictureSize(1280, 720);
parameters.setPreviewSize(1280, 720);
logSupportParameters(parameters);
mCamera.setParameters(parameters);
mCamera.takePicture(null, null, callBack);
因为自定义view 生成的图像肯定跟屏幕像素一致,但是我们的相机可以照像素很高的照片,解决办法把照片尺寸设置成默认分辨率。
肯定还会有同学在mCamera.setParameters(parameters);这个方法报错。
这是因为设置的图片大小
parameters.setPictureSize(1280, 720)和parameters.setPreviewSize(1280, 720)
这两个方法的参数设置的有问题,相机摄像头不支持这个参数,这是个硬件问题,我们可以通过下面这个方法得到支持的尺寸,设置进来。
/**
* 打印摄像头支持的 分辨率
* @param parameters
*/
private void logSupportParameters(Camera.Parameters parameters) {
List SupportPictureSize = parameters.getSupportedPictureSizes();
for (Size size : SupportPictureSize) {
Log.i(“SIZE”, “SupportPictureSize = ” + size.width + “—” + size.height);
}
List SupportPreviewSize = parameters.getSupportedPreviewSizes();
for (Size size : SupportPreviewSize) {
Log.i(“SIZE”, “SupportPreviewSize = ” + size.width + “—” + size.height);
}
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
Log.i(“info”, “DisplayMetrics.width ==” + dm.widthPixels);
Log.i(“info”, “DisplayMetrics.height ==” + dm.heightPixels);
Log.i(“info”, “DisplayMetrics.density ==” + dm.density);
Log.i(“info”, “DisplayMetrics.densityDpi ==” + dm.densityDpi);
}
好了,最后给出demo源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值