【问题标题】:CameraX controller zooming not smoothCameraX 控制器缩放不流畅
【发布时间】:2021-03-09 03:25:58
【问题描述】:

我在我的应用程序中使用CameraX API 处理相机,我添加了SeekBar 来控制变焦相机,但是当我寻求 0 时它无法正常工作,它被缩小然后我寻求 100 它放大到最大数量,所以我需要做的是,缩放 0 - 100 平滑缩放

当前预览

CameraActivity.java

public class CameraActivity extends AppCompatActivity {

private Executor executor = Executors.newSingleThreadExecutor();
private int REQUEST_CODE_PERMISSIONS = 1001;
public static final int REQUEST_CAPTURE_IMAGE = 1002;
private final String[] REQUIRED_PERMISSIONS = new String[]{"android.permission.CAMERA", "android.permission.WRITE_EXTERNAL_STORAGE"};

private PreviewView mPreviewView;
private FloatingActionButton captureImage;
private VerticalSeekBar seekBar;
private Camera camera;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera);

    mPreviewView = findViewById(R.id.camera);
    captureImage = findViewById(R.id.capture);
    seekBar = findViewById(R.id.seekBar);


    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            camera.getCameraControl().setLinearZoom((float) (progress/100));
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });
    if(allPermissionsGranted()){
        startCamera(); //start camera if permission has been granted by user
    } else{
        ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS);
    }
}

private void startCamera() {

    final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);

    cameraProviderFuture.addListener(new Runnable() {
        @Override
        public void run() {
            try {

                ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                bindPreview(cameraProvider);

            } catch (ExecutionException | InterruptedException e) {
                // No errors need to be handled for this Future.
                // This should never be reached.
            }
        }
    }, ContextCompat.getMainExecutor(this));
}

void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {

    Preview preview = new Preview.Builder()
            .build();

    CameraSelector cameraSelector = new CameraSelector.Builder()
            .requireLensFacing(CameraSelector.LENS_FACING_BACK)
            .build();

    ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
            .build();

    ImageCapture.Builder builder = new ImageCapture.Builder();

    //Vendor-Extensions (The CameraX extensions dependency in build.gradle)
    HdrImageCaptureExtender hdrImageCaptureExtender = HdrImageCaptureExtender.create(builder);

    // Query if extension is available (optional).
    if (hdrImageCaptureExtender.isExtensionAvailable(cameraSelector)) {
        // Enable the extension if available.
        hdrImageCaptureExtender.enableExtension(cameraSelector);
    }

    final ImageCapture imageCapture = builder
            .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
            .build();
    preview.setSurfaceProvider(mPreviewView.getSurfaceProvider());

    camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis, imageCapture);
    camera.getCameraControl().setZoomRatio(0.1f);


    captureImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String path = getIntent().getStringExtra("path");
            File file = null;
            if(path != null){
                file = new File(path, getIntent().getStringExtra("fileName"));
            } else {
                SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US);
                file = new File(getBatchDirectoryName(), mDateFormat.format(new Date()) + ".jpg");
            }
            ImageCapture.Metadata metadata = new ImageCapture.Metadata();
            if(Session.getLocation() != null) {
                metadata.setLocation(Session.getLocation());
            }
            ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions.Builder(file).setMetadata(metadata).build();
            File finalFile = file;
            imageCapture.takePicture(outputFileOptions, executor, new ImageCapture.OnImageSavedCallback () {
                @Override
                public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
                    Intent intent=new Intent();
                    intent.putExtra("path", finalFile.getPath());
                    setResult(RESULT_OK, intent);
                    finish();
                   runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(CameraActivity.this, "Image Saved successfully", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
                @Override
                public void onError(@NonNull ImageCaptureException error) {
                    error.printStackTrace();
                }
            });
        }
    });
}

public String getBatchDirectoryName() {

    String app_folder_path = "";
    app_folder_path = Environment.getExternalStorageDirectory().toString() + "/images";
    File dir = new File(app_folder_path);
    if (!dir.exists() && !dir.mkdirs()) {

    }

    return app_folder_path;
}

private boolean allPermissionsGranted(){

    for(String permission : REQUIRED_PERMISSIONS){
        if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
            return false;
        }
    }
    return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    if(requestCode == REQUEST_CODE_PERMISSIONS){
        if(allPermissionsGranted()){
            startCamera();
        } else{
            Toast.makeText(this, "Permissions not granted by the user.", Toast.LENGTH_SHORT).show();
            this.finish();
        }
    }
}
}

【问题讨论】:

  • 尝试创建一个字段来分配 camera.getCameraControl(), ex) cameraControl / 这样你就可以调用 cameraControl.setLinearZoom((float) (progress/100)); onProgressChanged
  • 您的意思是将camera.getCameraControl() 分配给新字段,然后在onProgressChanged 上使用它?
  • 好吧,我想打电话给camera.getCameraControl() 会花费很多。
  • 但是它需要相同的实例,无论如何方法都无所谓,我需要找到解决方案,我们可以稍后优化它,你有什么想法吗?
  • 对不起:(我可以再帮忙了。

标签: java android android-activity camera android-camerax


【解决方案1】:

您错误地转换了值。所以改为:

camera.getCameraControl().setLinearZoom((float) (progress/100));

做:

camera.getCameraControl().setLinearZoom((float) progress/seekBar.getMax());

【讨论】:

  • seekBar.getMax() 是的,您在某些方面是正确的,但这不是我问题的答案,因为在seekBar.getMax() 中返回 100
  • 你直接得到 0 -> 1 的原因是你可以在转换为浮动之前进行除法。您需要先将其转换为浮点数,然后除以最大值。使用 getMax 只是良好的代码健康,与您的问题没有直接关系。
  • 谢谢,我不这么看,代码有时会很棘手
猜你喜欢
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多