Как увеличить камеру с помощью Android Camera2 API - PullRequest
0 голосов
/ 04 сентября 2018

Я использую Camera2 Api для своего приложения. У меня есть функция уменьшения масштаба. Я могу увеличивать и уменьшать масштаб, используя жест щепотки. Но как мне реализовать то же самое, используя панель поиска.

1 Ответ

0 голосов
/ 04 сентября 2018

Код для увеличения:

int mProgress;
{
    minZoom = getMinZoom();
    maxZoom = getMaxZoom() - 1;
    final int zoomStep = 1;

    seekBarCardZoom.setMax(Math.round(maxZoom - minZoom));
    seekBarCardZoom.setOnSeekBarChangeListener(
            new SeekBar.OnSeekBarChangeListener()
            {
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                    setCurrentZoom(Math.round(minZoom + (mProgress * zoomStep)));//not tested
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {}

                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    setCurrentZoom(Math.round(minZoom + (progress * zoomStep)));
                    if(fromUser) mProgress = progress;
                }
            }
    );
}

И использовал этот код в моем CameraManager, который расширяет BaseCameraManager:

@Override
public float getCurrentZoom() {
    return zoomLevel;
}

@Override
public void setCurrentZoom(float zoomLevel) {
    Rect zoomRect = getZoomRect(zoomLevel);
    if(zoomRect != null) {
        try {
            //you can try to add the synchronized object here 
            previewRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoomRect);
            captureSession.setRepeatingRequest(previewRequestBuilder.build(), captureCallback, backgroundHandler);
        } catch (Exception e) {
            Log.e(TAG, "Error updating preview: ", e);
        }
        this.zoomLevel = (int) zoomLevel;
    }
}

private Rect getZoomRect(float zoomLevel) {
    try {
        CameraCharacteristics characteristics = manager.getCameraCharacteristics(this.currentCameraId);
        float maxZoom = (characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM)) * 10;
        Rect activeRect = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
        if((zoomLevel <= maxZoom) && (zoomLevel > 1)) {
            int minW = (int) (activeRect.width() / maxZoom);
            int minH = (int) (activeRect.height() / maxZoom);
            int difW = activeRect.width() - minW;
            int difH = activeRect.height() - minH;
            int cropW = difW / 100 * (int) zoomLevel;
            int cropH = difH / 100 * (int) zoomLevel;
            cropW -= cropW & 3;
            cropH -= cropH & 3;
            return new Rect(cropW, cropH, activeRect.width() - cropW, activeRect.height() - cropH);
        } else if(zoomLevel == 0){
            return new Rect(0, 0, activeRect.width(), activeRect.height());
        }
        return null;
    } catch (Exception e) {
        Log.e(TAG, "Error during camera init");
        return null;
    }
}

@Override
public float getMaxZoom() {
    try {
        return (manager.getCameraCharacteristics(this.currentCameraId).get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM)) * 10;
    } catch (Exception e) {
        Log.e(TAG, "Error during camera init");
        return -1;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...