2013-05-10 68 views
2

我已经看到关于此主题的其他几个问题,但没有一个能够解决我的问题。我有一个工作正常的自定义相机应用程序,除缩放按钮外的所有内容。这是一个使用SDK分8个目标14我的代码:Android自定义相机变焦不起作用

@Override 
     public void surfaceChanged(SurfaceHolder holder, int format, int width, 
       int height) { 
      if (isPreviewing){ 
       camera.stopPreview(); 
      } 

      Camera.Parameters p = camera.getParameters(); 
      p.setPreviewSize(sizes.get(0).width, sizes.get(0).height); 
      p.setColorEffect(effect); 

      zoomControls = (ZoomControls) findViewById(R.id.zoomControls); 

      if (p.isZoomSupported()) { 
       maxZoomLevel = p.getMaxZoom(); 
       Toast.makeText(PictureTaker.this, String.valueOf(maxZoomLevel),Toast.LENGTH_LONG).show(); 
       zoomControls.setIsZoomInEnabled(true); 
       zoomControls.setIsZoomOutEnabled(true); 

       zoomControls.setOnZoomInClickListener(new OnClickListener() { 
        public void onClick(View v) { 
         if (currentZoomLevel < maxZoomLevel) { 
          currentZoomLevel++; 
          camera.startSmoothZoom(currentZoomLevel); 
          //Toast.makeText(PictureTaker.this, String.valueOf(currentZoomLevel),Toast.LENGTH_LONG).show(); 
         } 
        } 
       }); 

       zoomControls.setOnZoomOutClickListener(new OnClickListener() { 
        public void onClick(View v) { 
         if (currentZoomLevel > 0) { 
          currentZoomLevel--; 
          camera.startSmoothZoom(currentZoomLevel); 
         } 
        } 
       }); 
      } else { 
       zoomControls.setVisibility(View.GONE); 
      } 

      camera.setParameters(p); 

      try { 
       camera.setPreviewDisplay(holder); 
      } // end try 
      catch (IOException e) { 
       Log.v(TAG, e.toString()); 
      } // end catch 

      camera.startPreview(); // begin the preview 
      isPreviewing = true; 
     } 

的setColorEffect从选项菜单来了,完美的作品。我知道isZoomSupported和getMaxZoom正在工作,因为Toast在代码运行时显示“59”,但缩放按钮不起作用。这是从XML

<ZoomControls 
android:id="@+id/zoomControls" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true" 
android:layout_centerHorizontal="true" 
android:layout_marginBottom="17dp" 
android:baselineAligned="false" 
android:gravity="center_horizontal" 
android:orientation="horizontal" /> 

我都在清单中的必要权限并没有错误显示的logcat的zoomControl可。不知道我做错了什么。我添加了第二个Toast来报告当按钮被按下时currentZoomLevel是否被改变,并且它显示每次增加一个值。我也尝试不使用startSmoothZoom,只是设置缩放与

p.setZoom(currentZoomLevel); or p.setZoomLevel(15); 

而且都不工作。我的手机HTC Incredible在其原生相机应用程序上有一个完美的缩放。如果我注释掉代码中的zoomControl部分,一切工作正常,并且即使使用zoomControl代码,自定义相机的所有其他功能也能正常工作,但它不会缩放。

回答

5

想通了,也许这可以帮助一些其他人一直有类似的问题。这是平稳的缩放。猜猜我的HTC不支持这一点。

@Override 
     public void surfaceChanged(SurfaceHolder holder, int format, int width, 
       int height) { 
      if (isPreviewing){ 
       camera.stopPreview(); 
      } 

      p = camera.getParameters(); 
      p.setPreviewSize(sizes.get(0).width, sizes.get(0).height); 
      p.setColorEffect(effect); 



      if (p.isZoomSupported() && p.isSmoothZoomSupported()) { 
       //most phones 
       maxZoomLevel = p.getMaxZoom(); 

       zoomControls.setIsZoomInEnabled(true); 
       zoomControls.setIsZoomOutEnabled(true); 

       zoomControls.setOnZoomInClickListener(new OnClickListener() { 
        public void onClick(View v) { 
         if (currentZoomLevel < maxZoomLevel) { 
          currentZoomLevel++; 
          camera.startSmoothZoom(currentZoomLevel); 

         } 
        } 
       }); 

       zoomControls.setOnZoomOutClickListener(new OnClickListener() { 
        public void onClick(View v) { 
         if (currentZoomLevel > 0) { 
          currentZoomLevel--; 
          camera.startSmoothZoom(currentZoomLevel); 
         } 
        } 
       }); 
      } else if (p.isZoomSupported() && !p.isSmoothZoomSupported()){ 
       //stupid HTC phones 
       maxZoomLevel = p.getMaxZoom(); 

       zoomControls.setIsZoomInEnabled(true); 
       zoomControls.setIsZoomOutEnabled(true); 

       zoomControls.setOnZoomInClickListener(new OnClickListener() { 
        public void onClick(View v) { 
         if (currentZoomLevel < maxZoomLevel) { 
          currentZoomLevel++; 
          p.setZoom(currentZoomLevel); 
          camera.setParameters(p); 

         } 
        } 
       }); 

       zoomControls.setOnZoomOutClickListener(new OnClickListener() { 
        public void onClick(View v) { 
         if (currentZoomLevel > 0) { 
          currentZoomLevel--; 
          p.setZoom(currentZoomLevel); 
          camera.setParameters(p); 
         } 
        } 
       }); 
      }else{ 
       //no zoom on phone 
       zoomControls.setVisibility(View.GONE); 
      } 

      camera.setParameters(p); 

      try { 
       camera.setPreviewDisplay(holder); 
      } // end try 
      catch (IOException e) { 
       Log.v(TAG, e.toString()); 
      } // end catch 

      camera.startPreview(); // begin the preview 
      isPreviewing = true; 
     } // end method surfaceChanged 

这让我的HTC放大步骤。关键是在每次点击按钮后设置相机的参数。根据maxZoomLevel(我的HTC是59,但我的Droid 4只有15),您可以将当前的缩放级别设置为您想要的任何数字,在缩放控制点击期间使设备缩放速度更快。可能是一个更加整洁的编码方式,可能需要进行一些检查以确保maxZoomSize不返回NULL或其他东西,但它可以在多个设备上工作。

+0

喜u能帮助我,使用此代码它不是为我工作的IM它给空指针异常 – 2013-06-24 05:52:58

+0

冉到与我的HTC同样的问题。感谢张贴这! – Zac 2017-01-15 20:48:33

+0

即使在三星我面临同样的问题。感谢它节省了我的时间 – 2017-06-17 18:41:17

0

params.setZoom(currentZoomLevel); camera.setParameters(PARAMS);代码也适用于我的三星G3手机。

1

其简单算了一下startSmoothZoom()方法

遵循这样的:

Camera.Parameters params = camera.getParameters(); 
params.setZoom(zoom_value); 
camera.setParameters(params); 
+0

你能详细解释这个答案吗? – 2017-02-26 20:15:50

+0

而不是startSmoothZoom(current_zoom ++)使用params.setZoom(current_zoom ++) – 2017-02-26 20:56:13