android Zxing二维码扫描的两个问题

本文详细介绍如何为Zxing二维码扫描库添加手指放大和自动放大功能,通过集成特定代码实现更佳的用户体验,包括处理触摸事件、计算缩放、调整焦点区域等关键步骤。

Zxing二维码扫描,Android中的扫描二维码库,官方提公的库,缺少两个小功能:

1、手指放大

2、仿微信,自动放大

 

解决办法(参考大神博客,做一下记录,直接集成使用):

1、手指放大 (https://blog.youkuaiyun.com/qq_24531461/article/details/62887658

2、自动放大 (https://blog.youkuaiyun.com/u010705554/article/details/78204090?locationNum=9&fps=1

 

下面是我集成的部分代码

1、手指放大:

CaptureActivity中添加代码:
第一步:
autoScannerView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(cameraManager == null){
            return false;
        }
        if (event.getPointerCount() == 1) {
            handleFocusMetering(event, cameraManager.getCamera());
        } else {
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_POINTER_DOWN:
                    oldDist = getFingerSpacing(event);
                    break;
                case MotionEvent.ACTION_MOVE:
                    float newDist = getFingerSpacing(event);
                    if (newDist > oldDist) {
                        Log.e("Camera","进入放大手势");
                        handleZoom(true, cameraManager.getCamera());
                    } else if (newDist < oldDist) {
                        Log.e("Camera","进入缩小手势");
                        handleZoom(false, cameraManager.getCamera());
                    }
                    oldDist = newDist;
                    break;
            }
        }
        return true;
    }
});

第二步:

cameraManager.getCamera() 这个需要在 CameraManager 里面添加一个方法:

public synchronized Camera getCamera(){
    if(camera!=null){
        return camera.getCamera();
    }
    return null;
}

第三步:

/**********************************
*** 手势放大 (直接拷贝集成到CaptureActivity里面)
*******************************************/
    private void handleZoom(boolean isZoomIn, Camera camera) {
        if(camera==null)
            return;
        Log.e("Camera","进入缩小放大方法");
        Camera.Parameters params = camera.getParameters();
        if (params.isZoomSupported()) {
            int maxZoom = params.getMaxZoom();
            int zoom = params.getZoom();
            if (isZoomIn && zoom < maxZoom) {
                Log.e("Camera","进入放大方法zoom="+zoom);
                zoom++;
            } else if (zoom > 0) {
                Log.e("Camera","进入缩小方法zoom="+zoom);
                zoom--;
            }

            if(zoom > 30){
                return;
            }

            params.setZoom(zoom);
            camera.setParameters(params);
        } else {
            Log.i("TAG", "zoom not supported");
        }
    }

    private static void handleFocusMetering(MotionEvent event, Camera camera) {
        if(camera==null)
            return;

        Log.e("Camera","进入handleFocusMetering");
        Camera.Parameters params = camera.getParameters();
        Camera.Size previewSize = params.getPreviewSize();
        Rect focusRect = calculateTapArea(event.getX(), event.getY(), 1f, previewSize);
        Rect meteringRect = calculateTapArea(event.getX(), event.getY(), 1.5f, previewSize);

        camera.cancelAutoFocus();

        if (params.getMaxNumFocusAreas() > 0) {
            List<Camera.Area> focusAreas = new ArrayList<>();
            focusAreas.add(new Camera.Area(focusRect, 800));
            params.setFocusAreas(focusAreas);
        } else {
            Log.i("TAG", "focus areas not supported");
        }
        if (params.getMaxNumMeteringAreas() > 0) {
            List<Camera.Area> meteringAreas = new ArrayList<>();
            meteringAreas.add(new Camera.Area(meteringRect, 800));
            params.setMeteringAreas(meteringAreas);
        } else {
            Log.i("TAG", "metering areas not supported");
        }
        final String currentFocusMode = params.getFocusMode();
        params.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
        camera.setParameters(params);

        camera.autoFocus(new Camera.AutoFocusCallback() {
            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                Camera.Parameters params = camera.getParameters();
                params.setFocusMode(currentFocusMode);
                camera.setParameters(params);
            }
        });
    }

    private static float getFingerSpacing(MotionEvent event) {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        Log.e("Camera","getFingerSpacing ,计算距离 = " + (float) Math.sqrt(x * x + y * y));
        return (float) Math.sqrt(x * x + y * y);
    }

    private static Rect calculateTapArea(float x, float y, float coefficient, Camera.Size previewSize) {
        float focusAreaSize = 300;
        int areaSize = Float.valueOf(focusAreaSize * coefficient).intValue();
        int centerX = (int) (x / previewSize.width - 1000);
        int centerY = (int) (y / previewSize.height - 1000);

        int left = clamp(centerX - areaSize / 2, -1000, 1000);
        int top = clamp(centerY - areaSize / 2, -1000, 1000);

        RectF rectF = new RectF(left, top, left + areaSize, top + areaSize);

        return new Rect(Math.round(rectF.left), Math.round(rectF.top), Math.round(rectF.right), Math.round(rectF.bottom));
    }

    private static int clamp(int x, int min, int max) {
        if (x > max) {
            return max;
        }
        if (x < min) {
            return min;
        }
        return x;
    }

/**********************************手势放大********************************************/

 

2、仿微信,扫描自动放大:

https://blog.youkuaiyun.com/u010705554/article/details/78204090?locationNum=9&fps=1    这博客里已经很详细了,不做重复了,自己查看吧

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漠天515

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值