2013-05-10 21 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