开发者

GLSurfaceView/SurfaceView overlap

开发者 https://www.devze.com 2023-03-02 04:00 出处:网络
I asked a question about this earlier but received no responses, so I\'m trying again. I need to do a rendered 2D picture with some accompanying labels and graphics on a Motorola Xoom, Android 3.0.Al

I asked a question about this earlier but received no responses, so I'm trying again.

I need to do a rendered 2D picture with some accompanying labels and graphics on a Motorola Xoom, Android 3.0. Although what I need can be done with just a SurfaceView (Canvas) or just a GLSurfaceView, I would really like to use both because the rendering is faster with the GLSurfaceView, and the labeling and graphics are easier with the SurfaceView. The visual layout is as shown below.

GLSurfaceView/SurfaceView overlap

I tried to put the SurfaceView on top by declaring it in the layout XML after the GLSurfaceView. The SurfaceView is transparent (except for where I explicitly draw stuff) so that the GLSurfaceView can still be seen.

This approach has worked pretty well with one huge exception. Anything that I draw on the SurfaceView that is in the GLSurfaceView region does not show up at all. To verify this I drew开发者_JAVA技巧 some text that was right on the boundary (some in the shared region, some just in the SurfaceView region), and it was chopped off at the GLSurfaceView boundary. I have tried using the "bringToFront" method to fix this, but it hasn't worked.

Can anyone give me some ideas on why this isn't working or what I can do about it? Is it that the GLSurfaceView is in front, or is that the GLSurfaceView writes directly to the video memory, so it doesn't matter if something is in front of it?


The way SurfaceViews work will make it impossible to do what you want. You will have to render your text inside the GLSurfaceView.


Never try to overlap a GLSurfaceView with anything (above or below). At best it breaks on your device and you catch it early, at worst it works on one device and not others. Bite the bullet and do everything in a GL view or none of it. If you need the speed then GL is the way to go.


we should set setZOrderMediaOverlay and setZOrderOnTop to true value

setZOrderMediaOverlay

Added in API level 5 void setZOrderMediaOverlay (boolean isMediaOverlay) Control whether the surface view's surface is placed on top of another regular surface view in the window (but still behind the window itself). This is typically used to place overlays on top of an underlying media surface view.

Note that this must be set before the surface view's containing window is attached to the window manager.

Calling this overrides any previous call to setZOrderOnTop(boolean).

setZOrderOnTop

Added in API level 5 void setZOrderOnTop (boolean onTop) Control whether the surface view's surface is placed on top of its window. Normally it is placed behind the window, to allow it to (for the most part) appear to composite with the views in the hierarchy. By setting this, you cause it to be placed above the window. This means that none of the contents of the window this SurfaceView is in will be visible on top of its surface.

Note that this must be set before the surface view's containing window is attached to the window manager.

Calling this overrides any previous call to setZOrderMediaOverlay(boolean).

Please refer to this link : http://developer.android.com/reference/android/view/SurfaceView.html#setZOrderMediaOverlay(boolean)

0

精彩评论

暂无评论...
验证码 换一张
取 消