首页 > 编程知识 正文

android中camera使用,androidcamera下载

时间:2023-05-04 17:07:29 阅读:116864 作者:1013

一、前言安卓定制相机的开发,经常需要通过手势放大或缩小相机的预览画面。 是数字变焦数字zoom。

二、界面说明1 .最大倍率floatmaxzoom=mcameracharacteristics.get (cameracharacteristics.scaler _ available _ max _ digigitics

如果常规预览屏幕(即,无缩放矩形为activity_rect,放大的预览屏幕矩形为crop_rect ),则宽度与高度之比最多只能为maxZoom。 例如,我在测试中获得的值是10.0。 (PS:activity_rect的宽度高度为分子,crop_rect的宽度高度为分母)

2 .获取未缩放的正常预览屏幕大小rect rect=mcameracharacteristics.get (cameracharacteristics.sensor _ info _ active _ aray ) 此大小用于计算最终放大显示的屏幕的大小。

3 .照相机预览请求器设置要显示的画面区域mpreviewrequestbuilder.set (捕获请求. scaler _ crop _ region,zoomRect ); 计算出的zoomRect通过上述接口设置为预览。

三、代码实现1 .相机视图处理触摸事件隐私浮动模块; @ overridepublicbooleanontouchevent (运动事件) if ) event.getpointercount (==2) ) /如果存在两个触摸点, 终于缩放switch(event.getaction ) ) MotionEvent.ACTION_MASK ) casemotionevent.action _ pointer _ down 3360//(在点上casemotionevent.action _ move ://移动时,根据距离是变大还是变小,放大或缩小预览画面的floatnewdistance=getfingerspacing (event ) 新离散模型离散(if )相机代理. handle zoom (true ); } else if (newdistancemolddistance ) mcameraproxy.Handlezoom ) false; //molddistancemolddistance=更新new distance; 布雷克; 默认: break; } return super.ontouchevent (event ); }隐私保护功能填充(运动事件) ) floatx=event.getx(0)- event.getX(1) ) 1; floaty=event.gety(0)- event.getY(1) ) 1; 返回(浮动) math.sqrt ) x*xy*y ); }上只处理了触摸事件,但预览的放大和缩小的逻辑通过mCameraProxy的Handlezoom(Booleaniszoomin )来实现。

2. handleZoom (实现私有int m zoom=0; //publicvoidhandlezoom (booleaniszoomin ) if ) mcamera设备==null|=mcameracharacteristics==null floatmaxzoom=mcameracharacteristics.get (cameracharacteristics.scaler _ available _ max _ digital _ zoom ); log.d(tag,' handle zoom : max zoom : ' max zoom ); int factor=100; //放大/缩小的主要原因之一是,设定越大越平滑,放大速度也相应变慢的if(iszoominmzoomfactor(mzoom; }elseif(mzoom0) mzoom----; //解释一下这个mZoom,它只是一个0到因子的值。 将屏幕从正常大小放大到最大的过程分为//100部分(因子值)。 也就是说,是1分割最小的像素变化单元。 mZoom表示有多少个此类单元log.d ) tag、' Handlezom。 rect rect=mcameracharacteristics.get (cameracharacteristics.sensor _ info _ active _ array _ size ); //最小像素变化单位minW和minhintminw=(int ) (rect.width )- rect.width )/maxZoom )/(2 * factor ) ); intminh=(int ) ) rect.height )- rect.height ) )/maxZoom )/)/(2 * factor ); //修剪后的宽度、高度的像素等于minW乘以mZoom。 int cropW=minW * mZoom; int cropH=minH * mZoom; log.d(tag,' handle zoom : cropw : ' cropw ',cropH: ' cropH ); //从上下左右坐标中分别减去对应的修剪尺寸后,放大显示的区域为rectzoomrect=new rect (rect.leftcropw,rect.top cropH,rect.right - cropW, rect.bottom - cropH //为预览设置的requestbuildermpreviewrequestbuilder.set (capture request.scaler _ crop _ region,) mpreviewrequest=mpreviewrequestbuilder.build (; 开始预览(; //需要重新启用start preview上的代码再简单说明一下,因为最大zoom的值本来就不是很大,直接使用1 ~最大zoom的int值进行缩放的话画面变化很剧烈,所以int 这个值可以自己设定。 所以mZoom的判定范围也为0~factor。

计算minW和minH代码。 原始Rect的宽度为rect.width(),放大到最大时zoomRect的宽度为rect.width() / maxZoom,有左右边,它们的差必须除以2,再分为factor

最后,如果放大时从1开始增加mZoom,缩小时从1开始减少mZoom,则得到由mZoom裁剪的宽度和高度的大小。

四、工程地址完整代码可见:

3359 github.com/afei-cn/camera demo/blob/master/app/src/main/Java/com/afei/camera demo/camera/camerar

显示相关的使用案例。

自定义Camera系列的: SurfaceView Camera2

自定义Camera系列的: TextureView Camera2

自定义Camera系列的: GLSurfaceView Camera2

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。