2011-02-11 23 views
5

我正在嘗試爲Android構建增強現實應用程序,並遇到了分層表面視圖的問題。我需要一個表面視圖來顯示將疊加圖形的相機預覽,並且我需要一個表面視圖來繪製圖形。第二個表面還需要在相機預覽之上繪製,但具有透明背景。在我目前的實現中,我有兩個表面視圖按照它們應有的方式工作並顯示,但背景不透明,因此沒有第二個表面視圖的外觀,並且將圖形繪製疊加在相機預覽表面視圖上。這怎麼可能實現?在搜索大量堆棧溢出問題以及其他論壇時,我遇到了許多與此事有關的意見衝突。有人說在Android中分層表面視圖是不可能的,而另外一些人說它是使用不同的佈局(FrameLayout與LinearLayout?)的問題。具體來說,我的實現包括兩個視圖:一個類,一個擴展SurfaceView的CustomCameraView,一個類,CustomDrawView,它還擴展了包含在FrameLayout中的SurfaceView,並在CustomCameraView之後出現了CustomDrawView。這些如何分層,以使CustomDrawView看起來疊加在CustomCameraView上?Android中的FrameLayout中的分層SurfaceViews

+0

你介意發佈你的視圖的XML代碼,也許快速的屏幕?然後有些人可以測試和理解。 –

回答

7

我想很多人都試過這個。 Google Enginee明確指出(here),您應該避免堆疊表面視圖。即使有人發現了一些竅門,它可能不兼容,並會導致問題。

我覺得這給了三個選項,根據您的要求:

  • 期(縣)的頂面觀

使用表面查看您的相機預覽和堆頂視圖的。這種方法的缺點是,在「正常」視圖a)上繪圖較慢,並且b)在UI線程中發生。你可以繞過b)如果你自己實現線程。但通常情況下,如果您的疊加層包含UI元素或幾個不需要經常更新的Drawable等東西,那可能就是這樣。

  • 盡一切的SurfaceView

這將使運行時喲更好的性能和更小的開銷。你只有一個SurfaceView。在SurfaceView上合成疊加層,並在那裏繪製所有內容。當然,你可以把兩種方法結合起來。

  • 盡一切在GLSurfaceView

這可能是去真正的性能的方式。像上面一樣,但在GLSurfaceView中將相機視圖渲染爲OpenGL紋理。

2

我使用下面的方法有攝像頭的上面SurfaceView 2點透明意見這方面的工作:

我的活動設立了其在onCreate()方法的所有意見,我讓沒有使用任何佈局文件。它看起來如下:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(null); //savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    cameraPreview = new CameraPreview(this); 
    addContentView(cameraPreview, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

    animationView = new AnimationView(this); 
    addContentView(animationView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

    crosslinesView = new CrosslinesView(this); 
    addContentView(crosslinesView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
} 

cameraPreviewSurfaceView型,animationViewcrosslinesViewsView型。後面兩個視圖的onDraw()看起來如下:

protected void onDraw(Canvas canvas) { 
    // Have the view being transparent 
    canvas.drawARGB(0, 0, 0, 0); 
    // Your drawing code goes here 
    // ... 
} 

祝你好運!