2011-02-11 10 views
5

Android用の拡張現実感アプリケーションを作成しようとしていて、レイヤー表示の問題を抱えています。私はグラフィックをオーバーレイするカメラのプレビューを表示するためにサーフェイスビューが必要です。グラフィックを描画するためにはサーフェイスビューが必要です。この第2の面は、カメラプレビューの上に描かれる必要があるが、背景が透明である必要がある。私の現在の実装では、両方のサーフェスビューが動作しているように見えますが、背景は透明ではないため、グラフィックスをカメラプレビューサーフェスビューに重ねて描いた2番目のサーフェスビューはありません。どのようにこれを達成することができますか?多数のスタックオーバーフローに関する質問だけでなく、他のフォーラムを検索する際に、私はこの問題に関する多くの矛盾する意見に出くわしました。 Androidのレイヤーサーフェイスビューは不可能だと言われていますが、別のレイアウト(FrameLayout vs. LinearLayout?)を使用する問題があると言う人もいます。具体的には、SurfaceViewを拡張するクラス、CustomCameraView、クラスCustomDrawViewは、CustomCameraViewの後に現れるCustomDrawViewでFrameLayoutに含まれるSurfaceViewも拡張します。 CustomDrawViewがCustomCameraViewにスーパーインポーズされるように、これらをどのようにレイヤーにすることができますか?AndroidのFrameLayoutにレイヤーされたSurfaceViews

+0

あなたのビューのXMLコードを投稿するのも気になるでしょうか?クイック画面ですか?その後、いくつかの人々がテスト&理解することができました。 –

答えて

7

私は多くの人がこれを試したと思います。 Google Engineeは、表面ビューの積み重ねを避ける必要があることを明確に示しました(here)。たとえ誰かがそれをするためにいくつかのトリックを見つけたとしても、それはおそらく互換性がなく、問題につながるでしょう。

私はあなたの要件に応じて、これは3つのオプションを与えると思う:

  • ビュー(s)は表面図の上に

カメラのプレビューのための表面図を使用し、上にビューを積み重ねますそれの。このアプローチの欠点は、「通常の」ビューa)の描画が遅く、b)UIスレッドで発生することです。自分でスレッドを実装する場合は、b)を回避することができます。しかし、一般的には、オーバーレイにUI要素やDrawableのようなものが含まれていて、あまり頻繁に更新する必要がない場合は、おそらくその方法でしょう。

  • これは、実行中のヨーヨーパフォーマンスが向上し、より少ないオーバーヘッドを与えるSurfaceView

に全力を尽くします。 SurfaceViewは1つしかありません。あなたの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)); 
} 

cameraPreviewはタイプSurfaceViewanimationViewであり、crosslinesViewsはタイプViewです。後者の2つのビューのonDraw()は、次のようになります。

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

幸運を祈る!

関連する問題