2016-11-17 48 views
0

我有我在我的應用程序CameraPreview定製surfaceview,我想實現雙指縮放,通過實施這兩種方法:Android的雙指縮放

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     Camera camera = getCamera(); 
     if (camera == null) { 
      return true; 
     } 

     Camera.Parameters params = camera.getParameters(); 

     int action = event.getAction(); 

     if (event.getPointerCount() > 1) { 
      if (action == MotionEvent.ACTION_POINTER_DOWN) { 
       MCLog.v(TAG, "Single "); 
       mDist = getFingerSpacing(event); 
       MCLog.w(TAG, "Original distance " + mDist); 
      } else if (action == MotionEvent.ACTION_MOVE && params.isZoomSupported()) { 
       camera.cancelAutoFocus(); 
       handleZoom(event, params); 
      } 
     } else { 
      if (action == MotionEvent.ACTION_UP) { 

       mFirstTime = false; 
       handleFocus(event, params); 
      } 
     } 
     return true; 
    } 

    private void handleZoom(MotionEvent event, Camera.Parameters params) { 


     if(mFirstTime) { 
      mDist = getFingerSpacing(event); 
      mFirstTime = false; 
      return; 
     } 


     List<Integer> zoomRatios = params.getZoomRatios(); 
     int maxZoom = params.getMaxZoom(); 
     int zoom = params.getZoom(); 

     double spacing = getFingerSpacing(event); 

     MCLog.w(TAG, String.format("Old zoom is: %s", zoom)); 

     //Percentage of displacement 
     MCLog.w(TAG, String.format("Original distance is: %s, new displacement is %s", mDist, spacing)); 
     double percentage = (mDist + spacing)/mDist; 
     if(mDist > spacing) 
     { 
      percentage *= -1; 
     } 
     MCLog.w(TAG, String.format("Percentage is: %s", percentage)); 



     zoom = new Double(zoom + percentage).intValue(); 
     MCLog.w(TAG, String.format("New zoom is: %s", zoom)); 


     if (zoom > maxZoom) { 
      zoom = maxZoom; 
     } 

     if (zoom < 0) { 
      zoom = 0; 
     } 
     mDist = spacing; 

     params.setZoom(zoom); 
     if (mZoomListener != null) { 
      mZoomListener.onZoomChanged(zoomRatios.get(zoom)); 
     } 
     getCamera().setParameters(params); 
    } 

這似乎是工作,但變焦稍微有些延遲,我放大圖像的時間越長。就像我會停止捏,圖像仍然會保持放大。

我找不到任何執行縮放除了this one之外的相機,所以也許這是做錯了什麼。

+0

是您的日誌記錄(如「新縮放爲:」行)也仍然顯示你停止後捏?或者它停止,但縮放不斷髮生? –

+0

我認爲日誌記錄仍然顯示出來。 –

回答

0

因爲你所看到的記錄可繼續你擡起手指,這可能意味着你不處理你的觸摸事件隊列足夠快了。

setProperties調用並不是特別快。

所以你需要限速不知何故,並丟棄你沒有時間來處理觸摸事件。有各種各樣折衷的選擇。

我對輸入API不是很熟悉,所以不確定是否有一些參數可以調整以降低通話率 - 也許只有在縮放比例超過晚餐閾值時才做任何事情,然後增加閾值,直到縮放不滯後?

,也可以送變焦調用另一個線程實際調用setParameters,以及剛落變焦調用地板如果線程,如果已經忙於處理以前的電話。

或者更好,有一個「nextZoom」參數,你的變焦設置線程看一次完成其現有的呼叫,然後只需要在每次調用觸摸事件處理程序更新nextZoom。縮放設置線程隨後會在完成上次設置的調用後始終檢查該值是否已更改,如果是,則再次設置該值。

然後您總能獲得最新的縮放級別,他們就不會堆積起來無論是。