残念ながら、両方のコンポーネントがインタラクティブ/ライブである必要がある場合、カメラ プレビューとマップの間でクロスフェードすることはできません。以前のコメントで述べたように、これは両方のウィジェットの性質と Android 合成の制限に関連しています。
カメラ プレビューがSurfaceView
正しく機能するには、 が必要です。公式ドキュメントから:
SurfaceView はウィンドウに穴を開けて、その表面を表示できるようにします。ビュー階層は、通常はその上に表示される SurfaceView の兄弟を Surface と正しく合成する処理を行います。これは、Surface の上にボタンなどのオーバーレイを配置するために使用できますが、Surface が変更されるたびに完全なアルファブレンド合成が実行されるため、パフォーマンスに影響を与える可能性があることに注意してください。
Google マップ v2SurfaceView
も使用されているため (ここを参照)、基本的に 2 つのSurfaceView
インスタンスが重なり合っており、各ウィジェットの描画方法を制御できないため、目的を達成するためにグラデーション マスクを適用することはできません。自体:
- カメラ プレビュー
SurfaceView
はカメラ バッファを受け取り、ネイティブにレンダリングします
- マップ
SurfaceView
は別のプロセスでレンダリングされます。
さらに、 の 2 つのインスタンスをSurfaceView
一緒に使用することは、次のように推奨されません。
サーフェス ビューが実装される方法は、別のサーフェスが作成され、それを含むウィンドウの背後で Z オーダーされ、透明なピクセルが SurfaceView がある四角形に描画されるため、背後のサーフェスを見ることができます。複数の表面ビューを許可するつもりはありませんでした。
あなたが持っている唯一のオプションは、それらの1つだけをライブ/インタラクティブにすることを選択し、もう1つをその上に静的な画像グラデーションとして描画することだと思います.
編集
私の以前の声明をさらに検証するために、カメラの使用に関する公式ドキュメントからの引用を以下に示します。
重要:完全に初期化された SurfaceHolder を setPreviewDisplay(SurfaceHolder) に渡します。サーフェスがないと、カメラはプレビューを開始できません。
したがってSurfaceView
、 からプレビューを取得するには、を使用する必要がありますCamera
。いつも。
繰り返しになりますが、これらのピクセルのレンダリング方法を制御することはできません。プレビューを使用しCamera
てフレームバッファに直接書き込むSurfaceHolder
ためです。
結論として、2 つの完全に不透明な SurfaceView
インスタンスがあり、それらのコンテンツに派手なレンダリングを適用することはできないため、Android ではそのような効果は単に実用的ではないと思います。