SurfaceView flashes black on load

后端 未结 8 1563
忘了有多久
忘了有多久 2020-11-28 02:59

I have a drawing app that takes about 2-5 seconds to load the drawing for complicated drawings (done via an AsyncTask). For a better user experience, during thi

相关标签:
8条回答
  • 2020-11-28 03:40

    I think I found the reason for the black flash. In my case I'm using a SurfaceView inside a Fragment and dynamically adding this fragment to the activity after some action. The moment when I add the fragment to the activity, the screen flashes black. I checked out grepcode for the SurfaceView source and here's what I found: when the surface view appears in the window the very fist time, it requests the window's parameters changing by calling a private IWindowSession.relayout(..) method. This method "gives" you a new frame, window, and window surface. I think the screen blinks right at that moment.

    The solution is pretty simple: if your window already has appropriate parameters it will not refresh all the window's stuff and the screen will not blink. The simplest solution is to add a 0px height plain SurfaceView to the first layout of your activity. This will recreate the window before the activity is shown on the screen, and when you set your second layout it will just continue using the window with the current parameters. I hope this helps.

    UPDATE: Looks like after years this behavior is still there. I would recommend to use TextureView instead of SurfaceView. This is literally a newer implementation of same thing that don't have this side effect as well as don't have a problem of black background when you moving it (for instance within ScrollView, ViewPager, RecyclerView etc).

    0 讨论(0)
  • 2020-11-28 03:42

    CrazyOrr's solution worked for me, but it was deep in the comments for the top answer by Evos, so here it is again:

    There is a less messy approach, just put getWindow().setFormat(PixelFormat.TRANSLUCENT); in the host activity's onCreate() callback before calling setContentView(). – CrazyOrr May 5 '16 at 7:29

    Simply putting

    getWindow().setFormat(PixelFormat.TRANSLUCENT); 
    

    in the activity's onCreate() worked for me.

    0 讨论(0)
  • 2020-11-28 03:47

    " the canvas available in onDraw() does not seem to draw to the SurfaceView" - Are you sure that you do not create the second (or third...) instance of the Surface View? And some of them could be black and be shown for a second. I don't see the code here, so, I can't tell surely, but if it were in my application, I would check for this error at first.

    0 讨论(0)
  • 2020-11-28 03:55

    I assume that you're drawing some heavy code in your surface view because as far as I know, the surface view will show the complete view after drawing everything one time. I suggest you first go to the onDraw() method of surface view then set on background of canvas then call forcefully invalidate to avoid that black screen. Add a condition to be sure that this forcefully invalidate is only called once.

    0 讨论(0)
  • 2020-11-28 03:58

    If you use NavigationDrawer with fragments, than Evos solution will not work!
    Try to use NavigationDrawer with Activities instead of fragments, this will help you 100%

    How to implement NavDrawer with activities: link
    Another helpful link. (in case of SurfaceView will draw on top of SlidingMenu)

    0 讨论(0)
  • 2020-11-28 03:58

    I facing the same issue but thank for this answer

    There is a less messy approach, just put getWindow().setFormat(PixelFormat.TRANSLUCENT); in the host activity's onCreate() callback before calling setContentView().

    0 讨论(0)
提交回复
热议问题