SurfaceView滚动时闪烁

Posted

技术标签:

【中文标题】SurfaceView滚动时闪烁【英文标题】:SurfaceView flickering when scrolling 【发布时间】:2018-06-20 09:48:00 【问题描述】:

我有一个滚动视图并在其中嵌套了几个自定义SurfaceView。当我滚动时,SurfaceView 背景开始闪烁黑色。我已经对此进行了至少一天的研究,但无法找到解决方案。我已经尝试实现这个线程的解决方案:http://android-coding.blogspot.ca/2012/01/flickering-problems-due-to-double.html,但没有成功。

使用我的 SurfaceView,我正在尝试绘制文本和下载的表情符号图像。最初,我使用自定义视图,但在尝试在 UI 线程中下载位图并收到 NetworkOnMainThreadException 后被阻止。所以我尝试对视图的整个 onDraw() 部分使用AsyncTask。但是,视图仍然是空白的,AsyncTask 完成后我无法更新它。在AsyncTask 完成后,我尝试在视图上调用invalidate(),但它导致了onDraw() 的无限循环。然后我创建了一个布尔变量来停止这个循环并只渲染一次视图,但它以与我开始时相同的方式结束:一个空白视图。

现在我正在尝试使用SurfaceView,因为我阅读了

这个类的一个目的是提供一个表面,辅助线程可以在其中渲染到屏幕中

并认为我应该使用它,因为我正在使用单独的线程来下载位图。

现在我实现了SurfaceView,它不能按照我想要的方式工作,因为它在我滚动时会闪烁黑色。我在这里记录了:https://youtu.be/o5j9s4XF65E

此处粘贴错误代码:https://pastebin.com/g61aSNM2

我要问的问题:

我应该为此使用SurfaceView 吗?如果没有,那么实现这一点的正确方法是什么?

我应该使用Thread 而不是AsyncTask 从网址下载位图吗?

为什么 SurfaceView 会闪烁,我该怎么办?

【问题讨论】:

【参考方案1】:

好的,我花了一些时间重新考虑我的视图结构,并意识到我不应该使用SurfaceView

我创建了我的自定义视图,TextMessage,扩展ImageView,在onDraw() 期间,我调用了我的自定义AsyncTask<TextMessage, Void, Bitmap>,它只是创建了一个视图应该是什么的位图。在AsyncTask 完成后,在onPostExecute() 方法中,我在TextMessage 上调用了setImageBitmap(myBitmap),这是我首先作为参数传递的。

这太简单了,我完全把我的问题想多了,我一开始就不应该使用SurfaceView

【讨论】:

以上是关于SurfaceView滚动时闪烁的主要内容,如果未能解决你的问题,请参考以下文章

SurfaceView drawText 闪烁

SurfaceView 闪烁/撕裂

Android SurfaceView导致屏幕闪烁

在 iOS 8 中滚动时背景图像闪烁问题

为啥平滑滚动在滚动之前会闪烁?

安卓——SurfaceView。在不清除屏幕的情况下更新。 (注:我是菜鸟)