Estoy intentando crear una aplicación de realidad aumentada para Android y he encontrado el problema de la superposición de vistas en superficie. Necesito una vista de superficie para mostrar la vista previa de la cámara en la que superpondré los gráficos, y necesito una vista de superficie para dibujar mis gráficos. Esta segunda superficie también debe dibujarse sobre la vista previa de la cámara, pero tiene un fondo transparente. En mi implementación actual, tengo ambas vistas de superficie trabajando y apareciendo como se supone que deben hacerlo, pero el fondo no es transparente y por lo tanto no aparece la segunda vista de superficie con los gráficos dibujados superpuestos en la vista de superficie de vista previa de la cámara. ¿Cómo se puede lograr esto? Después de buscar numerosas preguntas de desbordamiento de pila, así como otros foros, he encontrado muchas opiniones contradictorias relacionadas con este asunto. Algunos dicen que la superposición de vistas de superficie en Android es imposible, mientras que otros dicen que se trata de utilizar un diseño diferente (FrameLayout vs. LinearLayout?) Específicamente, mi implementación incluye dos vistas: una clase, CustomCameraView, que extiende SurfaceView y una clase , CustomDrawView, que también extiende SurfaceView contenido en un FrameLayout con el CustomDrawView que aparece después de CustomCameraView. ¿Cómo se pueden superponer estas capas para que CustomDrawView aparezca superpuesto en CustomCameraView?SurfaceViews en capas en FrameLayout en Android
Respuesta
Creo que mucha gente lo ha intentado. Un motor de Google declaró (here) claramente, que debe evitar apilar vistas de superficie. Incluso si alguien ha encontrado algún truco para hacerlo, probablemente sea incompatible y dará lugar a problemas.
Creo que esto da tres opciones, dependiendo de sus necesidades:
- Vista (s) en la cima de la superficie Ver
Utilice una superficie Vista de la cámara de vista previa y la pila de Vistas en la parte superior de eso La desventaja de este enfoque es que el uso de Vistas "normales" a) es más lento yb) tiene lugar en el hilo de la interfaz de usuario. Puede moverse b) si implementa los hilos usted mismo. Pero en general, ese es probablemente el camino a seguir si sus superposiciones contienen algo así como elementos de UI o algunos Drawables que no necesitan actualizarse con demasiada frecuencia.
- hacer todo en un SurfaceView
Esto dará yo mejor rendimiento y menos sobrecarga en tiempo de ejecución. Tienes solo un SurfaceView. Compone las superposiciones en tu SurfaceView y dibuja todo allí. Por supuesto, puedes combinar ambos enfoques.
- hacer todo en un GLSurfaceView
Este es probablemente el camino a seguir para obtener un rendimiento real. Como en el ejemplo anterior, pero con la representación de la vista de cámara en una textura OpenGL en GLSurfaceView.
Tengo este trabajo que tiene 2 vistas transparentes anteriores SurfaceView de la cámara mediante el siguiente enfoque:
Mi actividad pone en marcha todos sus puntos de vista en el método onCreate()
, no hago uso de cualquier archivo de diseño para eso. Se ve de la siguiente manera:
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
es de tipo SurfaceView
, animationView
y crosslinesViews
son de tipo View
. El onDraw()
de los 2 últimos puntos de vista se ve de la siguiente manera:
protected void onDraw(Canvas canvas) {
// Have the view being transparent
canvas.drawARGB(0, 0, 0, 0);
// Your drawing code goes here
// ...
}
Buena suerte!
- 1. Cómo ocultar framelayout dinámicamente en android
- 2. Android crear capas en lienzo
- 3. Android: Defina los márgenes en un FrameLayout no programmatically- trabajo
- 4. vista de centro de Android en FrameLayout no funciona
- 5. Vista de lugar dentro de FrameLayout en Android
- 6. Cómo establecer la imagen en el centro en FrameLayout
- 7. margen FrameLayout no trabajar
- 8. Cómo crear vistas en capas
- 9. UIDatePicker en UIActionSheet capas problema
- 10. Interfaces en diferentes capas lógicas
- 11. Gráficos en capas en d3.js
- 12. surfaceview + glsurfaceview + framelayout
- 13. ClassCastException al inflar un FrameLayout en un GridView
- 14. FrameLayout layout_weight programación
- 15. Cambiando el contenido de framelayout en el botón clic
- 16. Android: ¿Alinear el botón en la esquina inferior derecha de la pantalla con FrameLayout?
- 17. Android Honeycomb: ¿Cómo cambiar Fragmentos en FrameLayout, sin volver a crearlos?
- 18. proveedor de servicio por capas en C#
- 19. OpenGL estéreo en ventana de capas
- 20. Capas de varias imágenes en 3D-espacio
- 21. Navegación en capas Magento y SEO
- 22. COLLADA Cargador en capas para OpenGL3.1 + Contexto
- 23. Compatibilidad con varias vistas superpuestas activas superpuestas en Android
- 24. Magento Obtener el filtro seleccionado en la Navegación en capas
- 25. Navegación en capas Magento en subcategorías no mostradas
- 26. Manejo de excepciones en una aplicación en capas
- 27. Gestión de eventos de clic en capas indexadas en z
- 28. Patrones para implementar aplicaciones empresariales en capas escritas en Java
- 29. diseño con el fragmento y FrameLayout reemplazado por otro fragmento y FrameLayout
- 30. Cómo establecer el tamaño dibujable en la lista de capas
¿Te importa publicar el código XML de tu vista y tal vez una pantalla rápida? Entonces algunas personas podrían probar y entender. –