android – SurfaceView在加载时闪烁黑色

我有一个绘图应用程序,需要大约2-5秒来加载复杂的图纸绘图(通过AsyncTask完成)。为了更好的用户体验,在这段时间我闪存存储的PNG版本的图纸我有从应用程序目录作为ImageView,并显示一个加载ProgressBar在Activity构造函数中调用setContentView()

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
    android:id="@+id/flash"
    android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@color/note_bg_white"
        android:contentDescription="@string/content_desc_flash_img"
        android:focusable="false" />
<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="6dp"
        android:paddingLeft="6dp"
    android:paddingRight="6dp"
        android:gravity="bottom|center_vertical">
        <ProgressBar 
            style="?android:attr/progressBarStyleHorizontal"
    android:id="@+id/toolbar_progress"
    android:layout_width="match_parent"
    android:layout_height="18dp"
    android:gravity="bottom|center_vertical" />
    </RelativeLayout>
</FrameLayout>

当AsyncTask完成后,我再次使用新的布局调用setContentView():

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff">
    <com.my.package.DrawingCanvas
        android:id="@+id/canvas"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:focusable="true"
        android:background="#ffffff" />
</RelativeLayout>

当我使用一个简单的Canvas模型,这完美地工作,因为自定义DrawingCanvas视图将绘制到屏幕上的初始onDraw(),然后显示给用户,但现在使用SurfaceView与绘图循环,我看到闪烁的布局,然后当绘图被加载时,黑屏大约一秒钟,然后终于新的DrawingCanvas。

我假设原因是与绘图循环线程的启动时间有关,我已经离开了我的overDraw()在SurfaceView中,它被调用,但onDraw()中可用的画布不似乎绘制到SurfaceView。我也尝试在上面的XML中设置纯色背景,希望至少显示一个白色背景,但这些似乎从未似乎影响,即使设置它从代码。

任何建议或解释我看到与黑色屏幕?

编辑:

好的,已经确认onDraw()正在绘制到同一个画布,所以留下我的绘制ops在那里,以及希望在初始显示的SurfaceView,用户会看到这些图纸像在常规Canvas实现,当绘图线程已经启动,它将覆盖Canvas。

但是,如果我清除绘图线程操作,我确实看到onDraw()结果,但是再次,黑屏后闪烁。如果我完全删除onDraw()覆盖,我仍然看到黑色闪光,然后我看到从白色背景的XML布局。

所以,看起来不管什么,我总是会看到黑色屏幕,除非可能,而不是切换布局,我只是修改已经活跃的现有的“闪存”布局?

EDIT2:

已尝试使用ViewStub,以便我可以在加载note后将SurfaceView充入现有的View,但是同样的issu仍然适用。就像我可以告诉,在SurfaceView构造函数和调用surfaceCreated()执行之间有一个相当大的(〜200ms)延迟,但不确定这是黑屏发生的地方,或为什么屏幕被绘制黑色…

编辑3:

我最后的尝试现在包括制作SurfaceView transparent.这结合了留下现有的布局,只是通过ViewStub添加到该布局将导致一个工作的解决方案,虽然,但仍然,当SurfaceView加载时分秒屏幕在显示SurfaceView之前闪烁黑色,为透明。如果任何人有任何其他想法,尝试,请张贴他们。

我想我发现黑色闪光的原因。在我的情况下,我在一个Fragment内使用SurfaceView,并在一些操作后动态添加这个片段到活动。当我添加片段到活动的那一刻,屏幕闪烁黑色。我检查了grepcode的SurfaceView源和这里的我发现:当表面视图出现在窗口中的第一次,它请求窗口的参数更改通过调用一个私有的IWindowSession.relayout(..)方法。这种方法“给你”一个新的框架,窗口和窗口表面。我认为屏幕在那一刻闪烁。

解决方案很简单:如果你的窗口已经有合适的参数,它不会刷新所有的窗口的东西,屏幕不会闪烁。最简单的解决方案是在你的活动的第一个布局中添加一个0px高度的平面SurfaceView。这将在活动显示在屏幕上之前重新创建窗口,并且当您设置第二个布局时,它将继续使用带有当前参数的窗口。我希望这有帮助。

更新:看起来像几年后这种行为仍然存在。我建议使用TextureView而不是SurfaceView。这是一个更新的实现同样的东西,没有这种副作用,以及没有黑色背景的问题,当你移动它(例如在ScrollView,ViewPager,RecyclerView等)。

http://stackoverflow.com/questions/8772862/surfaceview-flashes-black-on-load

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:android – SurfaceView在加载时闪烁黑色