2016-12-06 107 views
1

经过对SO的一些研究,我找不到使用android.hardware.camera实现缩放缩放的方法。我正在使用SeekBar,但这不是我所需要的。有谁知道在哪里可以找到适用于Android SKD> = 15的示例?如何在Android中实现捏缩放?

在我的cameraFragment中,我使用了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.注册的最大缩放级别相机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视图中设置监听器= inflater.inflate(R.layout.fragment_test,container,false); view.setOnTouchListener(新View.OnTouchListener(){ 公共布尔onTouch(视图V,MotionEvent事件){ 如果(event.getAction()== MotionEvent.ACTION_MOVE){// 做一些 } 回报true; } }); – QuokMoon