2016-12-06 4 views
1

После некоторого исследования SO, я не могу найти способ реализовать масштабирование зума с помощью android.hardware.camera. Я использую SeekBar, но это не то, что мне нужно. Кто-нибудь знает, где я могу найти пример, который будет работать на Android SKD> = 15?Как реализовать масштабирование зума в Android?

В моей камереFragment я использую OnSeekBarChangeListener и в методе onProgressChanged я установил масштаб для камеры.

seekbar.setOnSeekBarChangeListener(this); 
..... 
@Override 
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    try { 
     Camera.Parameters params = camera.getParameters(); 
      params.setZoom(progress); 
      currentZoomLevel = progress; 
      params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
      camera.setParameters(params); 

      //set zoom level value 
      try { 
       float ratio = ((float) params.getZoomRatios().get(progress))/100; 
       tvZoomLevel.setText(String.format("%.1fX", ratio)); 
      } catch (Exception ex) { 
       Log.e(TAG, ex.getMessage()); 
      } 
    } catch (Exception ex) { 
     Log.e(TAG, ex.getMessage()); 
    } 
} 

ответ

2

1.Override onTouchEvent(MotionEvent event)

2.Get максимальный уровень масштабирования камеры param

3.Adjust ваш пинч зум в камеру param

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
    // Get the pointer ID 
    Camera.Parameters params = mCamera.getParameters(); 
    int action = event.getAction(); 


    if (event.getPointerCount() > 1) { 
     // handle multi-touch events 
     if (action == MotionEvent.ACTION_POINTER_DOWN) { 
      mDist = getFingerSpacing(event); 
     } else if (action == MotionEvent.ACTION_MOVE && params.isZoomSupported()) { 
      mCamera.cancelAutoFocus(); 
      handleZoom(event, params); 
     } 
    } else { 
     // handle single touch events 
     if (action == MotionEvent.ACTION_UP) { 
      handleFocus(event, params); 
     } 
    } 
    return true; 
} 

private void handleZoom(MotionEvent event, Camera.Parameters params) { 
    int maxZoom = params.getMaxZoom(); 
    int zoom = params.getZoom(); 
    float newDist = getFingerSpacing(event); 
    if (newDist > mDist) { 
     //zoom in 
     if (zoom < maxZoom) 
      zoom++; 
    } else if (newDist < mDist) { 
     //zoom out 
     if (zoom > 0) 
      zoom--; 
    } 
    mDist = newDist; 
    params.setZoom(zoom); 
    mCamera.setParameters(params); 
} 

public void handleFocus(MotionEvent event, Camera.Parameters params) { 
    int pointerId = event.getPointerId(0); 
    int pointerIndex = event.findPointerIndex(pointerId); 
    // Get the pointer's current position 
    float x = event.getX(pointerIndex); 
    float y = event.getY(pointerIndex); 

    List<String> supportedFocusModes = params.getSupportedFocusModes(); 
    if (supportedFocusModes != null && supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) { 
     mCamera.autoFocus(new Camera.AutoFocusCallback() { 
      @Override 
      public void onAutoFocus(boolean b, Camera camera) { 
       // currently set to auto-focus on single touch 
      } 
     }); 
    } 
} 

/** Determine the space between the first two fingers */ 
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); 
} 

Это определенный шаг поможет вам выполнить ваше требование.

+1

Работает на Android 4.x. Единственное, что я изменил: return (float) Math.sqrt (x * x + y * y); – Dylan

+0

Для тех, кто реализует это в фрагменте, добавьте View v = inflater.inflate (R.layout.fragment, container, false); v.setOnTouchListener (это); – Dylan

+1

Вы можете установить прослушиватель в свой view.iew view = inflater.inflate (R.layout.fragment_test, container, false); view.setOnTouchListener (новый View.OnTouchListener() { общественного логический onTouch (View v, MotionEvent событие) { если (event.getAction() == MotionEvent.ACTION_MOVE) { // сделать что-то } возвращение true; } }); – QuokMoon

Смежные вопросы