Android如何避免切换至SurfaceView时闪屏(黑屏闪一下)

最近的项目中,有一个Activity用到Fragment+ViewPager,其中一个fragment中实现了视频播放的功能,包含有SurfaceView。结果,每次打开程序第一次进入到该Activity时都会闪屏黑一下。原因就出在SurfaceView。

详解:

  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.

原因:

SurfaceView因为不同于一般的view,它有自己良好的缓冲以及数据存取机制,系统对他有特殊处理。当surfaceview第一次在当前activity上添加的时候,系统会给WindowManager重新排布局,relayout,这样就会黑一下,这个只会出现在第一次,以后再添加surfaceview时就不会黑屏了。

解决:

可以在没有进入surfaceview的界面(比如很多程序一进去就有个Loading界面)的时候,在其它界面的layout.xml文件中添加一个SurfaceView,宽和高都弄成0dp,这样对布局没影响,而且这个东西使得surfaceview第一次出现了,那么也就是说,下一次我们真正用到SurfaceView的时候就不会闪屏了。

时间: 2024-08-26 07:45:23

Android如何避免切换至SurfaceView时闪屏(黑屏闪一下)的相关文章

Android项目启动时短暂的黑屏白屏处理

刚从csdn转战51,这是在51写的第一篇博客 那么我们来谈谈这样一个问题.当你的项目需要用的欢迎界面有时候会出现短暂的黑屏或白屏,这样用户体验就不好了,所以今天教教大家如何处理这种问题. 其实,黑屏或者白屏是因为程序还没有加载布局就已经显示window窗口背景,而黑屏或者白屏就是window窗口背景.那么如何处理呢?看下面... public class LoadingActivity extends AppCompatActivity {          @Override       p

MTK-Android APP启动时瞬间闪现黑屏(Theme & Style)

闪屏原因:主要是我们启动Activity的时候,需要跑完onCreate和onResume:Android系统需要处理一些数据后,才会显示.按照这种思路,是不是我把初始化的工作尽量减少就可以避免黑屏?事实是,就算你onCreate啥都不做,仍然会闪一下黑屏,因为初始化解析界面时需要一定时间,下面是解决办法: 1.自定义Theme设置背景图Theme<style name="Theme.AppStartLoad" parent="android:Theme"&g

android实现系统电话通话过程中自动感应黑屏

package com.developmenttools.customui.activity; import java.util.HashSet;import java.util.Set; import com.developmenttools.listener.HomeClickListener;import com.yzx.tools.CustomLog; import android.app.Activity;import android.content.BroadcastReceiver

cocos2d-js 3.0rc0加载游戏引擎时长时间黑屏

如果是原始引擎的话是会比较大一些,但是最终发布的时候我们都建议你打包成release版,这个可以使用cocos命令 cocos compile -p web 来完成轻松打包,会在你的项目目录下创建一个publish目录,只需要将这个文件夹部署到服务器端就可以了,release模式的js文件都会被closure compiler高级压缩 另外,为了不引用引擎中你所不需要的模块,你可以在project.json中配置模块,参考下面两个文档: http://www.cocos2d-x.org/docs

ubuntu(双硬盘双系统)启动时卡死或黑屏 或 启动后分辨率改不了的解决方法

(Ubuntu  18.04)系统启动后卡死,黑屏,或者分辨率改不了的问题都是显卡驱动引起的, 解决方法: 1.(如果已经卡死了,则强制关机)开机: 2.(在选择系统的界面)选择ubuntu高级选项,回车: 3.(在出现的两个模式中)选择恢复(recovery)模式,回车: 4.(在出现的众多选项中)选择grub,回车(你能看到貌似很牛逼的一行行代码跑过): 5.(上面的代码跑完之后应该能重新回到众多选项的界面)选择resume,回车进入系统. 进入系统后很有可能分辨率又出问题了,此时只要更换显

android surfaceView 黑屏

最近在做一个viewpager + fragment 切换的页面, 其中一个fragment 打开摄像头,需要surfaceView,但是当切换到这个fragment的前一个个时,这个fragment也被加载了.导致会卡和闪一下黑屏. 黑屏解决: 在主FragmentAcivity的onCreate方法 getWindow().setFormat(PixelFormat.TRANSLUCENT); 加载慢的方法 viewpager的机制是 当加载一个view时,会保留前一个,显示当前view,预

Android 启动APP时黑屏白屏的三个解决方案

你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单,简历一个简单的例子就可以理解了. 其实,黑屏或者白屏这里并不是不正常,而是还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景.代码如下,可以自己写个小demo就理解了. @Override protected void onCreate(Bundle saved

Android 启动APP时黑屏白屏的三个解决方案(转载)

你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单,简历一个简单的例子就可以理解了. 其实,黑屏或者白屏这里并不是不正常,而是还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景.代码如下,可以自己写个小demo就理解了. 1 2 3 4 5 6 7 8 9 10 11 12 @Override protected

【Android】去除应用启动时黑屏现象

http://www.eoeandroid.com/blog-1169143-47979.html 在AndroidManifest里面定义的时候,在启动的Activity,添加android:theme="@android:style/Theme.Translucent",就不会出现黑屏现象了