Android切换至SurfaceView时闪屏(黑屏闪一下)以及黑屏移动问题的解决方法
1.最近的项目中,有一个Activity用到Fragment+ViewPager,其中一个fragment中实现了视频播放的功能,包含有SurfaceView。结果,每次打开程序第一次进入到该Activity时都会闪屏黑一下。原因就出在SurfaceView。
详解:
IthinkIfoundthereasonfortheblackflash.InmycaseI'musingaSurfaceViewinsideaFragmentanddynamicallyaddingthisfragmenttotheactivityaftersomeaction.ThemomentwhenIaddthefragmenttotheactivity,thescreenflashesblack.IcheckedoutgrepcodefortheSurfaceViewsourceandhere'swhatIfound:whenthesurfaceviewappearsinthewindowtheveryfisttime,itrequeststhewindow'sparameterschangingbycallingaprivateIWindowSession.relayout(..)method.Thismethod“gives”youanewframe,window,andwindowsurface.Ithinkthescreenblinksrightatthatmoment.
Thesolutionisprettysimple:ifyourwindowalreadyhasappropriateparametersitwillnotrefreshallthewindow'sstuffandthescreenwillnotblink.Thesimplestsolutionistoadda0pxheightplainSurfaceViewtothefirstlayoutofyouractivity.Thiswillrecreatethewindowbeforetheactivityisshownonthescreen,andwhenyousetyoursecondlayoutitwilljustcontinueusingthewindowwiththecurrentparameters.Ihopethishelps.
原因:
SurfaceView因为不同于一般的view,它有自己良好的缓冲以及数据存取机制,系统对他有特殊处理。当surfaceview第一次在当前activity上添加的时候,系统会给WindowManager重新排布局,relayout,这样就会黑一下,这个只会出现在第一次,以后再添加surfaceview时就不会黑屏了。
解决:
可以在没有进入surfaceview的界面(比如很多程序一进去就有个Loading界面)的时候,在其它界面的layout.xml文件中添加一个SurfaceView,宽和高都弄成0dp,这样对布局没影响,而且这个东西使得surfaceview第一次出现了,那么也就是说,下一次我们真正用到SurfaceView的时候就不会闪屏了。
2.viewpager中有surfaceview播放视频,来回滑屏时,关于黑屏移动问题
解决:
surfaceview.setZorderTop(true);
surfaceview.getHolder().setFormat(SurfaceView.TRANSPARENT);
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!