Layered Surfaceviews In A Framelayout In Android
Solution 1:
I think a lot of people have tried this. A Google Enginee stated (here) clearly, that you should avoid stacking Surface Views. Even if somebody has found some trick to do it, it is probably incompatible and will lead to problems.
I think this gives three options, depending on your requirements:
- View(s) on Top of Surface View
Use a Surface View for the Camera preview and stack Views on top of it. The disadvantage of this approach is that drawing on "normal" Views a) is slower and b) takes place in the UI thread. You can get around b) if you implement the threads yourself. But generally, that is probably the way to go if your overlays contain something like UI elements or a few Drawables that don't need to be updated too often.
- Do everything in a SurfaceView
This will give yo better performance and less overhead during runtime. You have just one SurfaceView. Composite the overlays on your SurfaceView and and draw everything there. Of course, you can combine both approaches.
- Do everything in a GLSurfaceView
This is probably the way to go for real performance. Like above, but with the camera view rendering to a OpenGL texture in a GLSurfaceView.
Solution 2:
I got this working having 2 transparent views above the camera's SurfaceView using the following approach:
My activity sets up all its views in the onCreate()
method, I make no use of any layout file for that. It looks as follows:
protectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(null); //savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
cameraPreview = newCameraPreview(this);
addContentView(cameraPreview, newLayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
animationView = newAnimationView(this);
addContentView(animationView, newLayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
crosslinesView = newCrosslinesView(this);
addContentView(crosslinesView, newLayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
}
cameraPreview
is of type SurfaceView
, animationView
and crosslinesViews
are of type View
. The onDraw()
of the 2 latter views looks as follows:
protectedvoidonDraw(Canvas canvas) {
// Have the view being transparent
canvas.drawARGB(0, 0, 0, 0);
// Your drawing code goes here// ...
}
Good luck!
Post a Comment for "Layered Surfaceviews In A Framelayout In Android"