RK3588 Android12 红外遥控预览镜头缩放(数码变焦)

一、适配红外遥控功能

参考:RK3288 Android11 适配红外遥控功能(超详细)-CSDN博客

1.配置设备树并使能红外遥控功能

这里我们把自定义的放大(KEY_CAMERA_ZOOMIN)和缩小(KEY_CAMERA_ZOOMOUT)键值给加上就行:

通过Android 映射到上层,在安卓的标准键值文件里面添加这两个按键对应的值:

frameworks/native/include/android/keycodes.h

@@ -776,7 +776,14 @@ enum {
     AKEYCODE_THUMBS_DOWN = 287,
     /** Used to switch current account that is consuming content.
      * May be consumed by system to switch current viewer profile. */
-    AKEYCODE_PROFILE_SWITCH = 288
+    AKEYCODE_PROFILE_SWITCH = 288,

+    AKEYCODE_CAMERA_ZOOMIN = 291,
+    AKEYCODE_CAMERA_ZOOMOUT = 292

frameworks/native/libs/input/InputEventLabels.cpp

@ -52,6 +52,10 @@ namespace android {
     DEFINE_KEYCODE(DPAD_CENTER), \
     DEFINE_KEYCODE(VOLUME_UP), \
     DEFINE_KEYCODE(VOLUME_DOWN), \
+    DEFINE_KEYCODE(CAMERA_ZOOMIN), \
+    DEFINE_KEYCODE(CAMERA_ZOOMOUT), \
     DEFINE_KEYCODE(POWER), \

配置完成后通过getevent命令查看是否有键值上报:

二、camera app预览缩放

关于预览缩放相关知识可以看一下这篇文章:Android Camera2相机预览画面放大缩小(数码变焦DigitalZoom)功能实现-CSDN博客

在app中添加以下接口:

初始化缩放宽度和高度的最小值

    private void initZoomParameter() {
        Rect rect = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
        Log.d(TAG, "sensor_info_active_array_size: " + rect);
        // max_digital_zoom 表示 active_rect 除以 crop_rect 的最大值
        float max_digital_zoom = mCameraCharacteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
        Log.d(TAG, "max_digital_zoom: " + max_digital_zoom);
        // crop_rect的最小宽高
        float minWidth = rect.width() / max_digital_zoom;
        float minHeight = rect.height() / max_digital_zoom;
        // 因为缩放时两边都要变化,所以要除以2
        mStepWidth = (rect.width() - minWidth) / MAX_ZOOM / 2;
        mStepHeight = (rect.height() - minHeight) / MAX_ZOOM / 2;
    }

缩放处理

    public void handleZoom(boolean isZoomIn) {
        if (mCameraDevice == null || mCameraCharacteristics == null || mPreviewRequestBuilder == null) {
            return;
        }
        if (isZoomIn && mZoom < MAX_ZOOM) { // 放大
            mZoom++;
        } else if (mZoom > 0) { // 缩小
            mZoom--;
        }
        Log.v(TAG, "handleZoom: mZoom: " + mZoom);
        Rect rect = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
        int cropW = (int) (mStepWidth * mZoom);
        int cropH = (int) (mStepHeight * mZoom);
        Rect zoomRect = new Rect(rect.left + cropW, rect.top + cropH, rect.right - cropW, rect.bottom - cropH);
        Log.d(TAG, "zoomRect: " + zoomRect);
        mPreviewRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoomRect);
        startPreview(); // 需要重新 start preview 才能生效
    }

再简单说明一下上面的代码,因为本身maxZoom的值并不会很大,如果直接使用 1~maxZoom 的 int 值去放大缩小,画面变化就很剧烈,所以设置了一个 MAX_ZOOM = 100 去把这个过程划分成了100份,这个值可以自己设定。所以 mZoom 的判定范围也就变成了 0~MAX_ZOOM 。

再说计算 mStepWidth 和 mStepHeight 的代码。原Rect的宽是 rect.width(),放大到最大时 zoomRect 的宽是 rect.width() / maxZoom,因为有左右两边,所以它们的差值需要除以2,然后划分成 MAX_ZOOM 份,需要再除以 MAX_ZOOM 。

最后,放大时我们让 mZoom 自增1,缩小时让 mZoom 自减1,根据 mZoom 就可以得到剪裁的宽高大大小了。

然后在对应的activity里监听按键按下上报时间,并且处理ZOOMIN和ZOOMOUT这两个键值:

    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        switch (keyCode) {
            /**放大**/
            case KeyEvent.KEYCODE_CAMERA_ZOOMIN :
                cameraPreviewManager.handleZoom(true);
                AppLogger.d(TAG, "KEYCODE_CAMERA_ZOOMIN");
                return true;
            case KeyEvent.KEYCODE_CAMERA_ZOOMOUT :
                /**缩小**/
                cameraPreviewManager.handleZoom(false);
                AppLogger.d(TAG, "KEYCODE_CAMERA_ZOOMOUT");
    }
        return super.onKeyDown(keyCode, event);
    }

添加以上接口在app响应的地方进行调用即可实现控制预览画面的放大和缩小

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哈~~哈~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值