第一步只是检测是否存在二维码,比如去寻找是否存在Position Detection Pattern,Timing Pattern,Alignment Pattern。如果检测到了,则返回DetectorResult,内部包含了定位点的位置信息;如果没检测到,则抛出NotFoundException。如果二维码很小,即使第一步检测存在二维码,但是第二步解码也可能会失败。由于我们在第一步已经能够知道二维码的大小,因此根据DetectorResult返回的二维码定位点信息计算出二维码的大致宽度,然后判断二维码大小在扫码框中是否足够小,如果足够小,则放大一定焦距:如果小于十分之一,则放大到最大焦距;如果小于等于六分之一,则放大到最大焦距的一半。
具体二维码的原理参见:二维码的生成细节和原理(见原文链接)
我们实现了zoomCamera( ),如果判断需要放大,则返回true,如果不需要放大,则返回false。代码如下:
我们在第一步和第二步中间插入该方法,如果需要放大,则不执行第二步;如果二维码已经足够大,则执行第二步。代码如下:
双击放大
原本Lark的二维码扫描中没有调整焦距的功能,这个对于一些特定场景下会不太方便,因此这里加入了双击放大的功能能够对焦距进行粗略的调整。利用GestureDetector的onDoubleTap()回调捕捉用户双击事件,并在CameraPreview中的onTouchEvent()中添加mGestureDetector.onTouchEvent()。实现如下:
重力传感器聚焦
重力传感器能够捕捉用户手机的运动状态,当检测到用户手机停止时,触发对焦逻辑。我们通过实现SensorEventListener接口,并重写onSensorChanged()监听手机的运动状态。
手势调整焦距
为了更精细化的让用户调整焦距,我们提供了手势来缩放焦距。通过在onTouchEvent()中获取用户两个手指的距离是越来越近还是越来越远来调整焦距。代码如下: