2016-12-06 6 views
1

そんなに研究したところ、android.hardware.cameraを使ってピンチズームを実装する方法を見つけることができません。私はSeekBarを使用していますが、これは私が必要とするものではありません。 Android SKD> = 15で動作するサンプルをどこに見つけることができるかを知っている人は誰ですか?Androidでピンチズームを実装する方法は?

私のcameraFragmentでは、私はOnSeekBarChangeListener を使用していて、onProgressChangedメソッドでカメラのズームを設定しました。カメラにあなたのピンチズーム3.Adjust

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

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(this); – Dylan

+1

リスナーをview.viewに設定できます。view = inflater.inflate(R.layout.fragment_test、container、false); view.setOnTouchListener(新View.OnTouchListener(){ 公共ブールonTouch(ビューV、MotionEventイベント){ (event.getAction()== MotionEvent.ACTION_MOVE)であれば{// } リターン何かをしますtrue; } }); – QuokMoon

関連する問題