2016-11-17 51 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。缩放设置线程随后会在完成上次设置的调用后始终检查该值是否已更改,如果是,则再次设置该值。

然后您总能获得最新的缩放级别,他们就不会堆积起来无论是。