我目前在按照自定义绘图时遇到问题SurfaceView
来自不在我的主 UI 上的线程。这SurfaceView
占据整个屏幕(Galaxy S3 全屏)并且必须从多个来源进行更新。
问题是习惯SurfaceView
不会保存 UI 更新之间的更改。
习俗SurfaceView
类是在使用它的活动和线程(我们称之为DrawingThread
)运行定期检查更新是在自定义中定义的SurfaceView
班级。我做了类似的事情本教程 http://danielnadeau.blogspot.com/2012/01/android-canvas-beginners-tutorial.html.
另一个外部线程正在更新必须对 UI 进行的更改列表。DrawingThread
每 50 毫秒左右检查一次此列表,如果列表不为空,则计算必须重绘的矩形。
// Thread waits for change request to UI or kill order
// Build Rect at point of Touch
try {
Canvas = _surfaceHolder.lockCanvas(Rect);
synchronized (_surfaceHolder) {
postInvalidate(); //Calls custom SurfaceView's onDraw() with the correct Canvas
}
} finally {
if (Canvas != null) {
_surfaceHolder.unlockCanvasAndPost(Canvas);
}
}
// Loop
My onDraw()
定制方法SurfaceView
在下面:
@Override
public void onDraw(Canvas canvas) {
// Initialize vars for rectangle
Paint.setStyle(Style.FILL);
for (MapChanges change : ExternalClass.getMapChanges()) {
// Build Rect at point of Touch
// Select Color for Paint
canvas.drawRect(Rect, Paint);
ExternalClass.removeMapChange(change); //Thread safe
}
}
除了忘记之前的任何更改之外,它的工作完美无缺onDraw()
称呼。我目前正在使用OnTouchListener
.
据我理解,代码流程:
- Touch 将对 UI 的更改请求添加到列表中
ExternalClass
.
-
DrawingThread
看到列表不再为空,安全地抓取 Canvas,并且postInvalidates()
调用自定义SurfaceView
's onDraw()
.
-
onDraw()
更新 UI 并从中删除更改请求ExternalClass
.
-
DrawingThread
发布Canvas
然后继续等待。
我的预期行为是,通过连续触摸,我会在屏幕上积累点。相反,每次触摸都会清除屏幕,只留下背景和我上次触摸屏幕的一个点。
我发现这非常令人困惑lockCanvas(Rect)
特别提到它将通过指定“脏”部分来保存锁之间的更改。谷歌搜索让我相信大多数用户发现了相反的问题:他们想要View
重绘,但每次更新都必须手动重绘。
为什么程序画得很干净SurfaceView
尽管我指定了要重绘的“脏”部分,但每次 UI 更新还是从头开始?
毫无疑问有人会提到我这个之前回答过的问题 https://stackoverflow.com/questions/2949036/android-how-to-get-a-custom-view-to-redraw-partially建议程序员使用位图。我试图避免这种情况,因为我对此很陌生,并且我不想使用大量内存(更新 UI 只是我代码的一小部分)。直接在平面上处理简单的形状View
对我来说是理想的。此外,它是作为一种解决方法提出的。这是 Android API 中的缺陷吗?
已经在这里和谷歌搜索了几个小时了。希望我没有错过任何明显的事情。