2016-03-13 4 views
6

Im новый камера для android2 APi. Я просто перевежу весь проект на новую камеру2 Api. Я использовал Camera2Basic example как отправную точку.андроид камера2 рукоятка zoom

Im теперь пытается ручки масштабирования, добавив следующее:

public boolean onTouchEvent(MotionEvent event) { 
    try { 
     CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
     CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraId); 
     float maxZoom = (characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM))*10; 

     Rect m = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); 
     int action = event.getAction(); 
     float current_finger_spacing; 

     if (event.getPointerCount() > 1) { 
      // Multi touch logic 
      current_finger_spacing = getFingerSpacing(event); 

      if(finger_spacing != 0){ 
       if(current_finger_spacing > finger_spacing && maxZoom > zoom_level){ 
        zoom_level++; 

       } 
       else if (current_finger_spacing < finger_spacing && zoom_level > 1){ 
        zoom_level--; 

       } 
       int minW = (int) (m.width()/maxZoom); 
       int minH = (int) (m.height()/maxZoom); 
       int difW = m.width() - minW; 
       int difH = m.height() - minH; 
       int cropW = difW /100 *(int)zoom_level; 
       int cropH = difH /100 *(int)zoom_level; 
       cropW -= cropW & 3; 
       cropH -= cropH & 3; 
       Rect zoom = new Rect(cropW, cropH, m.width() - cropW, m.height() - cropH); 
       mPreviewRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom); 
      } 
      finger_spacing = current_finger_spacing; 
     } 
     else{ 
      if (action == MotionEvent.ACTION_UP) { 
       //single touch logic 
      } 
     } 

     try { 
      mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback, 
        null); 
     } 
     catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 
     catch (NullPointerException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
    catch (CameraAccessException e) 
    { 
     throw new RuntimeException("can not access camera.", e); 
    } 

    return true; 
} 

И это:

private float getFingerSpacing(MotionEvent event) { 
    float x = event.getX(0) - event.getX(1); 
    float y = event.getY(0) - event.getY(1); 
    return FloatMath.sqrt(x * x + y * y); 
} 

Но после того, как я захватил, результат картина без увеличения. Как это сделать? Спасибо всем.

Update Нужно добавить captureBuilder.set (CaptureRequest.SCALER_CROP_REGION, масштабирование); Метод captureStillPicture().

+0

Вы исправились? –

+0

Да, добавлено мое решение ниже –

+0

Что такое метод captureStillPicture() ??? – user3819810

ответ

4

Необходимо добавить captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom); Метод captureStillPicture().

2

Вы только установили SCALER_CROP_REGION на CaptureRequestBuilder для вывода видеоизображения предварительного просмотра. Вам просто нужно добавить одно и то же свойство области обрезки в CaptureRequestBuilder, который использует выходной файл ImageSaver JPEG Surface, и вы должны быть настроены.

+0

Можете вы быть более spesific пожалуйста? В каком методе он должен отображаться? –

+0

@EliElezra, вы должны вызвать set. (CaptureRequest.SCALER_CROP_REGION) в построителе, который вы отправили на фотографию при ее захвате. Строитель содержит всю информацию о просмотре, которую вы просматриваете, и фотографию, которую он будет сохранять. Вы можете изменить параметры параметров предварительного просмотра и настройки фотографий в своем застройщике. Вы можете увидеть дополнительную информацию в: http://developer.android.com/intl/es/reference/android/hardware/camera2/CameraCharacteristics.html PD: Я даю вам сообщение ниже, как я это сделал, взглянуть. –

0

Просто установите SCALER.CROP.REGION на номер captureBuilder. Вы можете сделать это следующим образом:

yourCapturebuilder.(CaptureRequest.SCALER_CROP_REGION, newZoom); 

По-другому, если вы хотите сохранить предпочтение Zoom. Я предлагаю вам сделать что-то вроде этого: Сохраните Rect в предпочтении в виде строки, а позже восстановить его, чтобы использовать его, или назвать это каждый раз, когда вы открываете камеру:

Preferences.edit().putString(CameraSettings.KEY_ZOOM,newZoom.toString()); 

Позже этот метод вызывается, чтобы установить масштаб динамо:

public boolean setZoomValue(CaptureRequest.Builder builder) { 
     Log.i(TAG,"zoom preference value " + mPreferences.getString(CameraSettings.KEY_ZOOM,null)); 
     String rawZoomValue = mPreferences.getString(CameraSettings.KEY_ZOOM, null); 
     if (rawZoomValue == null) 
      return false; 
     rawZoomValue = rawZoomValue.replaceAll("[Rect() ]", ""); 
     String[] rectZoomList = rawZoomValue.split(",|\\-|\\)|\\("); 
     Rect zoomValue = new Rect(Integer.parseInt(rectZoomList[0]), Integer.parseInt(rectZoomList[1]), Integer.parseInt(rectZoomList[2]),Integer.parseInt(rectZoomList[3])); 
     builder.set(CaptureRequest.SCALER_CROP_REGION, zoomValue); 
     Log.i(TAG, "Zoom applied: " + zoomValue); 
     return true; 

    } 

Надеюсь, это поможет вам!