java - SurfaceView滚动时闪烁

标签 java android bitmap android-asynctask surfaceview

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

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

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

One of the purposes of this class is to provide a surface in which a secondary thread can render into the screen

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

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

这里有错误代码的 Pastebin:https://pastebin.com/g61aSNM2

我要问的问题:

  • 我应该使用 SurfaceView 来实现此目的吗?如果没有,那么实现这个的正确方法是什么?

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

  • 为什么 SurfaceView 闪烁?我该怎么办?

最佳答案

好吧,我花了一些时间重新思考 View 的结构,并意识到我不应该使用 SurfaceView .

我制作了自定义 View ,TextMessage ,扩展ImageView以及onDraw()期间我调用我的自定义AsyncTask<TextMessage, Void, Bitmap>它只是创建一个 View 应有的位图。之后AsyncTask完成,期间onPostExecute()我调用的方法setImageBitmap(myBitmap)关于TextMessage我首先将其作为参数传递。

这太简单了,我彻底思考了我的问题,我从来不应该使用 SurfaceView首先。

关于java - SurfaceView滚动时闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48200720/

相关文章:

java - Apache POI : find characters in Word document without spaces

安卓开发 : Accessing external SD card directly on Samsung devices (with extSdCard path)?

android - 如果我将位图放入 Bundle 并发送到服务,则不会调用 IntentService

android - 大屏幕内存不足 - 快速更改图像

java - Spring Boot 和 Hibernate 问题

java - 二维 ArrayList 到普通数组 java

java - GAE DatastoreService 查询没有得到任何结果?

Android 布局、可绘制对象和分辨率,最好的方法是什么?

android - Glide 在滚动之前不加载图像或根本不加载

Android copyPixelsFromBuffer() 到特定位图偏移量?