[android-developers] Re: ViewFlipper class does not support SurfaceView like it should
Hi all, I've followed this thread with interest because I had intended to do something very similar; that is, have multiple pages that the user can swipe between (using a ViewFlipper) where some screens may be composed of a mixture of SurfaceViews and normal Views. To be clear, I don't wish to have SurfaceViews at or greater than screen size; rather, just some of my smaller screen components are made using SurfaceViews. Now, after working with SurfaceViews quite a bit, I'm quite happy in my understanding of why a SurfaceView is special, and how it is effectively removed from the normal View hierarchy. (In simplistic terms, I think of the SurfaceView as a means of handing control of a specified screen video memory area directly to the application, with the benefit of separately-threaded update performance, but obvious cost of interaction with normal View hierarchy). Having read this discussion, what I'm not quite clear about in my head at the moment is exactly which combinations of ViewGroup container and SurfaceView are either just 'bad' (and why) or simply won't work. For example, for my application where the user can swipe between multiple pages of a dashboard in order to view various dashboard components (where some are made using SurfaceViews) I considered using a HorizontalScrollView. However, doing some Googling I did come across Dianne advising you shouldn't put a SurfaceView inside of a ScrollView or other such container (however, I note that was in response to someone wanting to scroll a SurfaceView that occupied more than the screen area). I did, however, find that a test Activity using a HorizontalScrollView with several SurfaceViews contained within did seem to work fine; I was able to scroll left and right to be able to view all SurfaceViews and they continued to redraw okay. So, to round up the question (and apologies for hijacking the OP's original thread slightly): in order to implement a layout that's larger than the screen size where the user scrolls back and forth to see all content, and where some of the screen components to be scrolled are implemented using SurfaceViews, what View mechanisms and / or ViewGroup derivatives should one *not* be using? Apologies in advance if I've misquoted or got the wrong end of the stick at all. Many thanks, Trev On Sep 21, 7:13 pm, MobileVisuals eyv...@astralvisuals.com wrote: I got this to work no without the ViewFlipper. I think that there should be information in the ViewFlipper class that it doesn't support SurfaceView. I lost many hours of work because of this. The reason I used the ViewFlipper class for SurfaceView was that other threads on this forum recommended it, like this one: https://groups.google.com/group/android-developers/browse_thread/thre... So there are other developers who have made the same mistake. On Sep 20, 3:51 pm, MobileVisuals eyv...@astralvisuals.com wrote: How can I then switch between a view with 2d rendering and a view with 3d rendering? I suppose I have to use GLSurfaceView for 3d rendering with OpenGL? On Sep 20, 3:00 pm, Jens dunkingbikk...@gmail.com wrote: That would be the gist of what both Dianne Romain Guy said yes. On Sep 20, 2:13 pm, MobileVisuals eyv...@astralvisuals.com wrote: GLSurfaceView extends SurfaceView. Does that mean that it is not possible to animate GLSurfaceView with a viewflipper? On Sep 20, 9:54 am, Romain Guy romain...@android.com wrote: You can animate another view on top of a SurfaceView, you just cannot animate the SurfaceView itself. On Tue, Sep 20, 2011 at 12:51 AM, MobileVisuals eyv...@astralvisuals.comwrote: Thanks for the info, I have spent many hours investigating this issue and now I finally know what the problem is. My app has a standard 2d menu. It is possible to view different 3d visual effects from the menu. The 3d visual effects are rendered in a GLSurfaceView. That class extends SurfaceView. You say that SurfaceView should not be used in a ViewFlipper. How can I implement my app if I can't use SurfaceView or GLSurfaceView? Which type of view should I use for the ViewFlipper? Can I render the 3d visual effects with other views than GLSurfaceView? Or shouldn't I use a ViewFlipper at all? If not, how can I then switch between the 2d and the 3d rendering? On Sep 19, 7:37 pm, Dianne Hackborn hack...@android.com wrote: Don't use a SurfaceView in a ViewFlipper. Nor a ListView. SurfaceView is a *very* *special* view. As it says, what it does is create a completely separate surface (a.k.a. window) that is associated with your main window. This window is positioned behind the main window, and a hole punched through your main window to see the surface behind. By its nature, this makes the interaction between the surface
Re: [android-developers] Re: ViewFlipper class does not support SurfaceView like it should
The mechanisms that won't work correctly with SurrfaceViews are animations of any kind (fade, translate, scale, etc.) Since a scroll is a form of a translate animation... On Sun, Sep 25, 2011 at 2:33 AM, Trev16v trev...@googlemail.com wrote: Hi all, I've followed this thread with interest because I had intended to do something very similar; that is, have multiple pages that the user can swipe between (using a ViewFlipper) where some screens may be composed of a mixture of SurfaceViews and normal Views. To be clear, I don't wish to have SurfaceViews at or greater than screen size; rather, just some of my smaller screen components are made using SurfaceViews. Now, after working with SurfaceViews quite a bit, I'm quite happy in my understanding of why a SurfaceView is special, and how it is effectively removed from the normal View hierarchy. (In simplistic terms, I think of the SurfaceView as a means of handing control of a specified screen video memory area directly to the application, with the benefit of separately-threaded update performance, but obvious cost of interaction with normal View hierarchy). Having read this discussion, what I'm not quite clear about in my head at the moment is exactly which combinations of ViewGroup container and SurfaceView are either just 'bad' (and why) or simply won't work. For example, for my application where the user can swipe between multiple pages of a dashboard in order to view various dashboard components (where some are made using SurfaceViews) I considered using a HorizontalScrollView. However, doing some Googling I did come across Dianne advising you shouldn't put a SurfaceView inside of a ScrollView or other such container (however, I note that was in response to someone wanting to scroll a SurfaceView that occupied more than the screen area). I did, however, find that a test Activity using a HorizontalScrollView with several SurfaceViews contained within did seem to work fine; I was able to scroll left and right to be able to view all SurfaceViews and they continued to redraw okay. So, to round up the question (and apologies for hijacking the OP's original thread slightly): in order to implement a layout that's larger than the screen size where the user scrolls back and forth to see all content, and where some of the screen components to be scrolled are implemented using SurfaceViews, what View mechanisms and / or ViewGroup derivatives should one *not* be using? Apologies in advance if I've misquoted or got the wrong end of the stick at all. Many thanks, Trev On Sep 21, 7:13 pm, MobileVisuals eyv...@astralvisuals.com wrote: I got this to work no without the ViewFlipper. I think that there should be information in the ViewFlipper class that it doesn't support SurfaceView. I lost many hours of work because of this. The reason I used the ViewFlipper class for SurfaceView was that other threads on this forum recommended it, like this one: https://groups.google.com/group/android-developers/browse_thread/thre... So there are other developers who have made the same mistake. On Sep 20, 3:51 pm, MobileVisuals eyv...@astralvisuals.com wrote: How can I then switch between a view with 2d rendering and a view with 3d rendering? I suppose I have to use GLSurfaceView for 3d rendering with OpenGL? On Sep 20, 3:00 pm, Jens dunkingbikk...@gmail.com wrote: That would be the gist of what both Dianne Romain Guy said yes. On Sep 20, 2:13 pm, MobileVisuals eyv...@astralvisuals.com wrote: GLSurfaceView extends SurfaceView. Does that mean that it is not possible to animate GLSurfaceView with a viewflipper? On Sep 20, 9:54 am, Romain Guy romain...@android.com wrote: You can animate another view on top of a SurfaceView, you just cannot animate the SurfaceView itself. On Tue, Sep 20, 2011 at 12:51 AM, MobileVisuals eyv...@astralvisuals.comwrote: Thanks for the info, I have spent many hours investigating this issue and now I finally know what the problem is. My app has a standard 2d menu. It is possible to view different 3d visual effects from the menu. The 3d visual effects are rendered in a GLSurfaceView. That class extends SurfaceView. You say that SurfaceView should not be used in a ViewFlipper. How can I implement my app if I can't use SurfaceView or GLSurfaceView? Which type of view should I use for the ViewFlipper? Can I render the 3d visual effects with other views than GLSurfaceView? Or shouldn't I use a ViewFlipper at all? If not, how can I then switch between the 2d and the 3d rendering? On Sep 19, 7:37 pm, Dianne Hackborn hack...@android.com wrote: Don't use a SurfaceView in a ViewFlipper. Nor a ListView. SurfaceView is a *very* *special* view. As it says, what it does is create a completely
[android-developers] Re: ViewFlipper class does not support SurfaceView like it should
I got this to work no without the ViewFlipper. I think that there should be information in the ViewFlipper class that it doesn't support SurfaceView. I lost many hours of work because of this. The reason I used the ViewFlipper class for SurfaceView was that other threads on this forum recommended it, like this one: https://groups.google.com/group/android-developers/browse_thread/thread/6e40d73d0883d150/e6da11407f5ac488?lnk=gstq=switch+between+GLSurfaceView#e6da11407f5ac488 So there are other developers who have made the same mistake. On Sep 20, 3:51 pm, MobileVisuals eyv...@astralvisuals.com wrote: How can I then switch between a view with 2d rendering and a view with 3d rendering? I suppose I have to use GLSurfaceView for 3d rendering with OpenGL? On Sep 20, 3:00 pm, Jens dunkingbikk...@gmail.com wrote: That would be the gist of what both Dianne Romain Guy said yes. On Sep 20, 2:13 pm, MobileVisuals eyv...@astralvisuals.com wrote: GLSurfaceView extends SurfaceView. Does that mean that it is not possible to animate GLSurfaceView with a viewflipper? On Sep 20, 9:54 am, Romain Guy romain...@android.com wrote: You can animate another view on top of a SurfaceView, you just cannot animate the SurfaceView itself. On Tue, Sep 20, 2011 at 12:51 AM, MobileVisuals eyv...@astralvisuals.comwrote: Thanks for the info, I have spent many hours investigating this issue and now I finally know what the problem is. My app has a standard 2d menu. It is possible to view different 3d visual effects from the menu. The 3d visual effects are rendered in a GLSurfaceView. That class extends SurfaceView. You say that SurfaceView should not be used in a ViewFlipper. How can I implement my app if I can't use SurfaceView or GLSurfaceView? Which type of view should I use for the ViewFlipper? Can I render the 3d visual effects with other views than GLSurfaceView? Or shouldn't I use a ViewFlipper at all? If not, how can I then switch between the 2d and the 3d rendering? On Sep 19, 7:37 pm, Dianne Hackborn hack...@android.com wrote: Don't use a SurfaceView in a ViewFlipper. Nor a ListView. SurfaceView is a *very* *special* view. As it says, what it does is create a completely separate surface (a.k.a. window) that is associated with your main window. This window is positioned behind the main window, and a hole punched through your main window to see the surface behind. By its nature, this makes the interaction between the surface of the surface view and the main view hierarchy limited. The purpose of SurfaceView is to present static things like video playback or a game playfield in its own surface so that it can draw outside of the normal view hierarchy update model (and use OpenGL drawing, different color spaces, etc). It is not to give a tight integration with the rest of the view hierarchy. You should essentially think of it as an overlay, because really that is what it is. On Mon, Sep 19, 2011 at 10:29 AM, MobileVisuals eyv...@astralvisuals.comwrote: My app uses a ViewFlipper. It is possible to flip between the views without problems at first.But after switching to another app and then switching back to the ViewFlipper app, it is not possible to flip between the views. One of the views is always displayed as just a black screen. I have investigated the reason for this, using the simplest possible SurfaceView. It is still the same problem. It is not a thread problem, I see that the onDraw method is called like it should. What is the reason for this? Doesn't the ViewFlipper class support SurfaceView like it should? I got the code for the SurfaceView from the basic tuturial: http://www.edu4java.com/androidgame/androidgame2.html and the code for the View flipper from Mark Murphys View flipper tutorial: https://github.com/commonsguy/cw-android/tree/master/Fancy/Flipper1 This is my code: - public class FlipperDemo2 extends Activity { ViewFlipper flipper; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); flipper=(ViewFlipper)findViewById(R.id.details); GameView lv=new GameView(this.getApplicationContext(),true); flipper.addView(lv, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); GameView lv2=new GameView(this.getApplicationContext(),false); flipper.addView(lv2, new ViewGroup.LayoutParams(
[android-developers] Re: ViewFlipper class does not support SurfaceView like it should
Thanks for the info, I have spent many hours investigating this issue and now I finally know what the problem is. My app has a standard 2d menu. It is possible to view different 3d visual effects from the menu. The 3d visual effects are rendered in a GLSurfaceView. That class extends SurfaceView. You say that SurfaceView should not be used in a ViewFlipper. How can I implement my app if I can't use SurfaceView or GLSurfaceView? Which type of view should I use for the ViewFlipper? Can I render the 3d visual effects with other views than GLSurfaceView? Or shouldn't I use a ViewFlipper at all? If not, how can I then switch between the 2d and the 3d rendering? On Sep 19, 7:37 pm, Dianne Hackborn hack...@android.com wrote: Don't use a SurfaceView in a ViewFlipper. Nor a ListView. SurfaceView is a *very* *special* view. As it says, what it does is create a completely separate surface (a.k.a. window) that is associated with your main window. This window is positioned behind the main window, and a hole punched through your main window to see the surface behind. By its nature, this makes the interaction between the surface of the surface view and the main view hierarchy limited. The purpose of SurfaceView is to present static things like video playback or a game playfield in its own surface so that it can draw outside of the normal view hierarchy update model (and use OpenGL drawing, different color spaces, etc). It is not to give a tight integration with the rest of the view hierarchy. You should essentially think of it as an overlay, because really that is what it is. On Mon, Sep 19, 2011 at 10:29 AM, MobileVisuals eyv...@astralvisuals.comwrote: My app uses a ViewFlipper. It is possible to flip between the views without problems at first.But after switching to another app and then switching back to the ViewFlipper app, it is not possible to flip between the views. One of the views is always displayed as just a black screen. I have investigated the reason for this, using the simplest possible SurfaceView. It is still the same problem. It is not a thread problem, I see that the onDraw method is called like it should. What is the reason for this? Doesn't the ViewFlipper class support SurfaceView like it should? I got the code for the SurfaceView from the basic tuturial: http://www.edu4java.com/androidgame/androidgame2.html and the code for the View flipper from Mark Murphys View flipper tutorial: https://github.com/commonsguy/cw-android/tree/master/Fancy/Flipper1 This is my code: - public class FlipperDemo2 extends Activity { ViewFlipper flipper; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); flipper=(ViewFlipper)findViewById(R.id.details); GameView lv=new GameView(this.getApplicationContext(),true); flipper.addView(lv, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); GameView lv2=new GameView(this.getApplicationContext(),false); flipper.addView(lv2, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); flipper.setFlipInterval(2000);//2000 flipper.startFlipping(); } } -- public class GameView extends SurfaceView { private SurfaceHolder holder; boolean blue; public GameView(Context context,boolean _blue) { super(context); holder = getHolder(); blue=_blue; holder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override public void surfaceCreated(SurfaceHolder holder) { Canvas c = holder.lockCanvas(null); onDraw(c); holder.unlockCanvasAndPost(c); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } }); } @Override protected void onDraw(Canvas canvas) { if(blue) canvas.drawColor(Color.YELLOW); else canvas.drawColor(Color.GREEN); } } -- You received this message because you are subscribed to the Google Groups Android Developers group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -- Dianne Hackborn Android framework engineer hack...@android.com Note: please
Re: [android-developers] Re: ViewFlipper class does not support SurfaceView like it should
You can animate another view on top of a SurfaceView, you just cannot animate the SurfaceView itself. On Tue, Sep 20, 2011 at 12:51 AM, MobileVisuals eyv...@astralvisuals.comwrote: Thanks for the info, I have spent many hours investigating this issue and now I finally know what the problem is. My app has a standard 2d menu. It is possible to view different 3d visual effects from the menu. The 3d visual effects are rendered in a GLSurfaceView. That class extends SurfaceView. You say that SurfaceView should not be used in a ViewFlipper. How can I implement my app if I can't use SurfaceView or GLSurfaceView? Which type of view should I use for the ViewFlipper? Can I render the 3d visual effects with other views than GLSurfaceView? Or shouldn't I use a ViewFlipper at all? If not, how can I then switch between the 2d and the 3d rendering? On Sep 19, 7:37 pm, Dianne Hackborn hack...@android.com wrote: Don't use a SurfaceView in a ViewFlipper. Nor a ListView. SurfaceView is a *very* *special* view. As it says, what it does is create a completely separate surface (a.k.a. window) that is associated with your main window. This window is positioned behind the main window, and a hole punched through your main window to see the surface behind. By its nature, this makes the interaction between the surface of the surface view and the main view hierarchy limited. The purpose of SurfaceView is to present static things like video playback or a game playfield in its own surface so that it can draw outside of the normal view hierarchy update model (and use OpenGL drawing, different color spaces, etc). It is not to give a tight integration with the rest of the view hierarchy. You should essentially think of it as an overlay, because really that is what it is. On Mon, Sep 19, 2011 at 10:29 AM, MobileVisuals eyv...@astralvisuals.comwrote: My app uses a ViewFlipper. It is possible to flip between the views without problems at first.But after switching to another app and then switching back to the ViewFlipper app, it is not possible to flip between the views. One of the views is always displayed as just a black screen. I have investigated the reason for this, using the simplest possible SurfaceView. It is still the same problem. It is not a thread problem, I see that the onDraw method is called like it should. What is the reason for this? Doesn't the ViewFlipper class support SurfaceView like it should? I got the code for the SurfaceView from the basic tuturial: http://www.edu4java.com/androidgame/androidgame2.html and the code for the View flipper from Mark Murphys View flipper tutorial: https://github.com/commonsguy/cw-android/tree/master/Fancy/Flipper1 This is my code: - public class FlipperDemo2 extends Activity { ViewFlipper flipper; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); flipper=(ViewFlipper)findViewById(R.id.details); GameView lv=new GameView(this.getApplicationContext(),true); flipper.addView(lv, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); GameView lv2=new GameView(this.getApplicationContext(),false); flipper.addView(lv2, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); flipper.setFlipInterval(2000);//2000 flipper.startFlipping(); } } -- public class GameView extends SurfaceView { private SurfaceHolder holder; boolean blue; public GameView(Context context,boolean _blue) { super(context); holder = getHolder(); blue=_blue; holder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override public void surfaceCreated(SurfaceHolder holder) { Canvas c = holder.lockCanvas(null); onDraw(c); holder.unlockCanvasAndPost(c); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }}); } @Override protected void onDraw(Canvas canvas) { if(blue) canvas.drawColor(Color.YELLOW); else canvas.drawColor(Color.GREEN); } } -- You received this message because you are subscribed to the Google Groups Android Developers group. To post to this group, send
[android-developers] Re: ViewFlipper class does not support SurfaceView like it should
GLSurfaceView extends SurfaceView. Does that mean that it is not possible to animate GLSurfaceView with a viewflipper? On Sep 20, 9:54 am, Romain Guy romain...@android.com wrote: You can animate another view on top of a SurfaceView, you just cannot animate the SurfaceView itself. On Tue, Sep 20, 2011 at 12:51 AM, MobileVisuals eyv...@astralvisuals.comwrote: Thanks for the info, I have spent many hours investigating this issue and now I finally know what the problem is. My app has a standard 2d menu. It is possible to view different 3d visual effects from the menu. The 3d visual effects are rendered in a GLSurfaceView. That class extends SurfaceView. You say that SurfaceView should not be used in a ViewFlipper. How can I implement my app if I can't use SurfaceView or GLSurfaceView? Which type of view should I use for the ViewFlipper? Can I render the 3d visual effects with other views than GLSurfaceView? Or shouldn't I use a ViewFlipper at all? If not, how can I then switch between the 2d and the 3d rendering? On Sep 19, 7:37 pm, Dianne Hackborn hack...@android.com wrote: Don't use a SurfaceView in a ViewFlipper. Nor a ListView. SurfaceView is a *very* *special* view. As it says, what it does is create a completely separate surface (a.k.a. window) that is associated with your main window. This window is positioned behind the main window, and a hole punched through your main window to see the surface behind. By its nature, this makes the interaction between the surface of the surface view and the main view hierarchy limited. The purpose of SurfaceView is to present static things like video playback or a game playfield in its own surface so that it can draw outside of the normal view hierarchy update model (and use OpenGL drawing, different color spaces, etc). It is not to give a tight integration with the rest of the view hierarchy. You should essentially think of it as an overlay, because really that is what it is. On Mon, Sep 19, 2011 at 10:29 AM, MobileVisuals eyv...@astralvisuals.comwrote: My app uses a ViewFlipper. It is possible to flip between the views without problems at first.But after switching to another app and then switching back to the ViewFlipper app, it is not possible to flip between the views. One of the views is always displayed as just a black screen. I have investigated the reason for this, using the simplest possible SurfaceView. It is still the same problem. It is not a thread problem, I see that the onDraw method is called like it should. What is the reason for this? Doesn't the ViewFlipper class support SurfaceView like it should? I got the code for the SurfaceView from the basic tuturial: http://www.edu4java.com/androidgame/androidgame2.html and the code for the View flipper from Mark Murphys View flipper tutorial: https://github.com/commonsguy/cw-android/tree/master/Fancy/Flipper1 This is my code: - public class FlipperDemo2 extends Activity { ViewFlipper flipper; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); flipper=(ViewFlipper)findViewById(R.id.details); GameView lv=new GameView(this.getApplicationContext(),true); flipper.addView(lv, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); GameView lv2=new GameView(this.getApplicationContext(),false); flipper.addView(lv2, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); flipper.setFlipInterval(2000);//2000 flipper.startFlipping(); } } -- public class GameView extends SurfaceView { private SurfaceHolder holder; boolean blue; public GameView(Context context,boolean _blue) { super(context); holder = getHolder(); blue=_blue; holder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override public void surfaceCreated(SurfaceHolder holder) { Canvas c = holder.lockCanvas(null); onDraw(c); holder.unlockCanvasAndPost(c); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } }); } @Override protected void onDraw(Canvas canvas) { if(blue)
[android-developers] Re: ViewFlipper class does not support SurfaceView like it should
That would be the gist of what both Dianne Romain Guy said yes. On Sep 20, 2:13 pm, MobileVisuals eyv...@astralvisuals.com wrote: GLSurfaceView extends SurfaceView. Does that mean that it is not possible to animate GLSurfaceView with a viewflipper? On Sep 20, 9:54 am, Romain Guy romain...@android.com wrote: You can animate another view on top of a SurfaceView, you just cannot animate the SurfaceView itself. On Tue, Sep 20, 2011 at 12:51 AM, MobileVisuals eyv...@astralvisuals.comwrote: Thanks for the info, I have spent many hours investigating this issue and now I finally know what the problem is. My app has a standard 2d menu. It is possible to view different 3d visual effects from the menu. The 3d visual effects are rendered in a GLSurfaceView. That class extends SurfaceView. You say that SurfaceView should not be used in a ViewFlipper. How can I implement my app if I can't use SurfaceView or GLSurfaceView? Which type of view should I use for the ViewFlipper? Can I render the 3d visual effects with other views than GLSurfaceView? Or shouldn't I use a ViewFlipper at all? If not, how can I then switch between the 2d and the 3d rendering? On Sep 19, 7:37 pm, Dianne Hackborn hack...@android.com wrote: Don't use a SurfaceView in a ViewFlipper. Nor a ListView. SurfaceView is a *very* *special* view. As it says, what it does is create a completely separate surface (a.k.a. window) that is associated with your main window. This window is positioned behind the main window, and a hole punched through your main window to see the surface behind. By its nature, this makes the interaction between the surface of the surface view and the main view hierarchy limited. The purpose of SurfaceView is to present static things like video playback or a game playfield in its own surface so that it can draw outside of the normal view hierarchy update model (and use OpenGL drawing, different color spaces, etc). It is not to give a tight integration with the rest of the view hierarchy. You should essentially think of it as an overlay, because really that is what it is. On Mon, Sep 19, 2011 at 10:29 AM, MobileVisuals eyv...@astralvisuals.comwrote: My app uses a ViewFlipper. It is possible to flip between the views without problems at first.But after switching to another app and then switching back to the ViewFlipper app, it is not possible to flip between the views. One of the views is always displayed as just a black screen. I have investigated the reason for this, using the simplest possible SurfaceView. It is still the same problem. It is not a thread problem, I see that the onDraw method is called like it should. What is the reason for this? Doesn't the ViewFlipper class support SurfaceView like it should? I got the code for the SurfaceView from the basic tuturial: http://www.edu4java.com/androidgame/androidgame2.html and the code for the View flipper from Mark Murphys View flipper tutorial: https://github.com/commonsguy/cw-android/tree/master/Fancy/Flipper1 This is my code: - public class FlipperDemo2 extends Activity { ViewFlipper flipper; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); flipper=(ViewFlipper)findViewById(R.id.details); GameView lv=new GameView(this.getApplicationContext(),true); flipper.addView(lv, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); GameView lv2=new GameView(this.getApplicationContext(),false); flipper.addView(lv2, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); flipper.setFlipInterval(2000);//2000 flipper.startFlipping(); } } -- public class GameView extends SurfaceView { private SurfaceHolder holder; boolean blue; public GameView(Context context,boolean _blue) { super(context); holder = getHolder(); blue=_blue; holder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override public void surfaceCreated(SurfaceHolder holder) { Canvas c = holder.lockCanvas(null); onDraw(c); holder.unlockCanvasAndPost(c); } @Override public void
[android-developers] Re: ViewFlipper class does not support SurfaceView like it should
How can I then switch between a view with 2d rendering and a view with 3d rendering? I suppose I have to use GLSurfaceView for 3d rendering with OpenGL? On Sep 20, 3:00 pm, Jens dunkingbikk...@gmail.com wrote: That would be the gist of what both Dianne Romain Guy said yes. On Sep 20, 2:13 pm, MobileVisuals eyv...@astralvisuals.com wrote: GLSurfaceView extends SurfaceView. Does that mean that it is not possible to animate GLSurfaceView with a viewflipper? On Sep 20, 9:54 am, Romain Guy romain...@android.com wrote: You can animate another view on top of a SurfaceView, you just cannot animate the SurfaceView itself. On Tue, Sep 20, 2011 at 12:51 AM, MobileVisuals eyv...@astralvisuals.comwrote: Thanks for the info, I have spent many hours investigating this issue and now I finally know what the problem is. My app has a standard 2d menu. It is possible to view different 3d visual effects from the menu. The 3d visual effects are rendered in a GLSurfaceView. That class extends SurfaceView. You say that SurfaceView should not be used in a ViewFlipper. How can I implement my app if I can't use SurfaceView or GLSurfaceView? Which type of view should I use for the ViewFlipper? Can I render the 3d visual effects with other views than GLSurfaceView? Or shouldn't I use a ViewFlipper at all? If not, how can I then switch between the 2d and the 3d rendering? On Sep 19, 7:37 pm, Dianne Hackborn hack...@android.com wrote: Don't use a SurfaceView in a ViewFlipper. Nor a ListView. SurfaceView is a *very* *special* view. As it says, what it does is create a completely separate surface (a.k.a. window) that is associated with your main window. This window is positioned behind the main window, and a hole punched through your main window to see the surface behind. By its nature, this makes the interaction between the surface of the surface view and the main view hierarchy limited. The purpose of SurfaceView is to present static things like video playback or a game playfield in its own surface so that it can draw outside of the normal view hierarchy update model (and use OpenGL drawing, different color spaces, etc). It is not to give a tight integration with the rest of the view hierarchy. You should essentially think of it as an overlay, because really that is what it is. On Mon, Sep 19, 2011 at 10:29 AM, MobileVisuals eyv...@astralvisuals.comwrote: My app uses a ViewFlipper. It is possible to flip between the views without problems at first.But after switching to another app and then switching back to the ViewFlipper app, it is not possible to flip between the views. One of the views is always displayed as just a black screen. I have investigated the reason for this, using the simplest possible SurfaceView. It is still the same problem. It is not a thread problem, I see that the onDraw method is called like it should. What is the reason for this? Doesn't the ViewFlipper class support SurfaceView like it should? I got the code for the SurfaceView from the basic tuturial: http://www.edu4java.com/androidgame/androidgame2.html and the code for the View flipper from Mark Murphys View flipper tutorial: https://github.com/commonsguy/cw-android/tree/master/Fancy/Flipper1 This is my code: - public class FlipperDemo2 extends Activity { ViewFlipper flipper; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); flipper=(ViewFlipper)findViewById(R.id.details); GameView lv=new GameView(this.getApplicationContext(),true); flipper.addView(lv, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); GameView lv2=new GameView(this.getApplicationContext(),false); flipper.addView(lv2, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); flipper.setFlipInterval(2000);//2000 flipper.startFlipping(); } } -- public class GameView extends SurfaceView { private SurfaceHolder holder; boolean blue; public GameView(Context context,boolean _blue) { super(context); holder = getHolder(); blue=_blue; holder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override