2012-02-09 75 views
5

我想要應用於它的顏色效果獲得相機預覽,例如NEGATIVE效果。沒有錯誤,預覽沒有問題可見,但獨立於我設置的ColorEffect - 相機預覽保持不變。我測試了我嘗試使用的效果是否可以通過運行params.getSupportedColorEffects()(也可以在內置的照片應用程序中使用這些效果)用於我的手機。ColorEffect在相機預覽上不可見

我不知道代碼有什麼問題 - 我在下面貼出來。也許這裏有人有一個想法是什麼可以使這項工作?提前致謝。

public class CustomCameraView extends SurfaceView{ 

Camera mCamera; 
SurfaceHolder mHolder; 

public CustomCameraView(Context context){ 
    super(context); 
    mHolder = this.getHolder(); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    mHolder.addCallback(mSurfaceHolderListener); 
} 

SurfaceHolder.Callback mSurfaceHolderListener = new SurfaceHolder.Callback() { 
    public void surfaceCreated(SurfaceHolder holder) { 
     mCamera=Camera.open(); 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
     } 
     catch (Exception e){ } 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) 
    { 
     Camera.Parameters params = mCamera.getParameters(); 
     params.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE); 
     mCamera.setParameters(params); 
     mCamera.startPreview(); 
    } 

    public void surfaceDestroyed(SurfaceHolder arg0) 
    { 
     mCamera.stopPreview(); 
     mCamera.release(); 
    } 
}; 
} 

一些測試後,它原來的問題可能涉及到的HTC Desire我在測試上(或者其操作系統版本)。該代碼在其他三星手機上正常工作。我還沒有弄清楚在HTC上可能會出現什麼問題。


更新: 我已經設法影響工作,但真正的意外,我還是不明白爲什麼。但我會在這裏給出答案 - 也許有人會發現它有用,或者可能會解釋爲什麼會發生這種情況:

我在surfaceChanged方法中添加了以下行,因爲我試圖減小預覽:

previewHolder.setFixedSize(width, height-1); 

這樣做的結果是使所選效果可見。

當我改變了這一行:

previewHolder.setFixedSize(width, height); 

的影響是不可見的任何更多的一次。很奇怪....它適用於設置高度小於收到的高度參數。

回答

1

我一直在爲此而苦苦掙扎。我發現HTC Desire的相機需要執行setParameters,setPreviewDisplaystartPreview的奇怪命令才能使色彩效果起作用。順序爲:

Camera.Parameters parameters = camera.getParameters(); 

//set the parameters 

camera.setParameters(parameters); 
camera.startPreview(); 
camera.setParameters(parameters); 
camera.setPreviewDisplay(surfaceHolder); 

調用startPreviewsetPreviewDisplay之前在Android SDK被記錄爲初始化相機和並聯surfaceView的一種方式。

關於讓您的影響無意中工作的更新,同樣的事情發生在我身上!我假設出於同樣的原因,我的一些代碼被快速成功地調用兩次(在我的情況下,由於數據庫對象的變化)。這導致該方法(重新)設置參數並(重新)啓動預覽以被調用兩次,產生期望的結果。在意識到這一點之後,再進行一些實驗,上述命令似乎對我的HTC Desire和Acer Iconia A500都有效,我對此感到滿意。

但是,我剛剛收到我的應用程序的評論,說它在HTC Desire HD上產生損壞的圖像,所以我建議不要將此相機初始化順序作爲默認值,而是作爲HTC Desire的修復程序。

0

將新參數設置爲相機並開始預覽invalidate()正在調用您的SurfaceView。但它只有Invalidate the whole view. If the view is visible, onDraw(android.graphics.Canvas) will be called at some point in the future.因此不能保證onDraw()會立即被調用。但onDraw()總是調用onMeasure()後調用大小不同於當前。所以這可能是這種奇怪行爲的原因。

0

簡單的答案使用以下類型:

Camera camera = null; 
    camera = Camera.open(); 

    if (camera != null) { 
    try { 
     Camera.Parameters parameters = camera.getParameters(); 

     // Set all kind of stuffs here.. 
      parameters.setSceneMode(Camera.Parameters.FLASH_MODE_AUTO); 
      parameters.setColorEffect(Camera.Parameters.EFFECT_SEPIA); // whatever effect you want 
      camera.setParameters(parameters); 

      camera.setPreviewDisplay(surface_holder); 
      camera.startPreview(); 

    } catch (IOException exception) { 
    camera.release(); 
    camera = null; 
} 
}