我有一个绘画应用程序,对于复杂的绘图(通过AsyncTask
完成),需要约2-5秒才能加载画图。为了提供更好的用户体验,在此期间,我会闪烁来自应用目录中已存储的PNG版本的绘图作为ImageView
,并在Activity构造函数中调用setContentView()
显示加载ProgressBar
:
<?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 View
会在初始的onDraw()
上将绘画绘制到屏幕上,然后再显示给用户,但现在使用带有绘图循环的SurfaceView
时,我看到了闪烁的布局,然后在加载绘画时,黑屏大约一秒钟,最后才出现新的DrawingCanvas。
我认为原因与绘图循环线程的启动时间有关,我已经在SurfaceView
中保留了我的onDraw()
覆盖,它被调用,但onDraw()
中可用的画布似乎没有绘制到SurfaceView
。我还尝试在上面的XML中设置纯色背景,希望至少显示白色背景,但即使从代码中设置它们,它们也似乎不起作用。
有什么建议或者对于我看到的黑屏的解释吗?
编辑:
好的,我确认onDraw()正在绘制到同一个画布上,所以我把我的绘制操作留在那里,希望在SurfaceView最初显示时,用户能像常规Canvas实现一样看到这些绘制,当绘制线程启动时,它会覆盖Canvas。
然而,如果我清除绘制线程操作,我确实可以看到onDraw()的结果,但是再次出现黑屏闪烁之后。如果我完全删除onDraw()覆盖,我仍然会看到黑色闪屏,然后看到来自XML的白色背景的布局。
因此,看起来无论如何,我总是会看到黑屏,除非也许不是切换布局,而是修改已经处于活动状态的“闪光”布局?
编辑2:
尝试使用ViewStub,以便在加载笔记后将SurfaceView膨胀到现有视图中,但是仍存在相同的问题。据我所知,在SurfaceView构造函数和surfaceCreated()调用执行之间有相当大的延迟(约200毫秒),但不确定黑屏是否发生在这里,或者为什么屏幕被绘制成黑色...
编辑3:
我现在的最后一次尝试包括使SurfaceView透明。这与保留现有布局并通过ViewStub简单地向该布局添加内容将导致一个可行的解决方案,但是仍然存在问题,当SurfaceView正在加载时,屏幕会闪烁黑色一瞬间,然后才会显示透明的SurfaceView。如果有其他想法,请发表。