2013-02-21 61 views
3

我们正在尝试写我们自己的MapView,我试图找出如何将覆盖到的MapView使他们得到在其他地图API绘制Android设备上查看的ViewGroup无效的OnDraw并绘制

我已经得到了扩展ViewGroup的MapView。我想我已经知道调用MapView.invalidate()会导致调用mapview的dispatchDraw方法。这听起来正确吗?

如果是这样,那么mapview的onDraw和draw方法何时被调用?

更重要的是所有这些观点以及哪些方法在什么地方记录得很好时调用?

谢谢!

EDIT This SO post解释,该延伸的ViewGroup班,的onDraw方法并不自动调用。如果你需要它,你必须强制它。但随着ebarrenchea指出,顺序是画,onDraw有,dispatchDraw如果所有的方法被称为

回答

0

您的ViewGroup调用invalidate将迫使draw运行这将反过来调用onDraw然后dispatchDraw。您应该查看文档here和查看源代码here以获取更多信息。

+0

是啊,我见过那个页面,但没有在那里说“调用invalidate导致......发生”。所以当我调用mapView.invalidate时,mapview的onDraw被执行,然后mapView的绘图,然后mapView的dispatchDraw,是否正确? – Josh 2013-02-22 13:00:10

+1

那里的文档声明“如果视图是可见的,onDraw(android.graphics.Canvas)将在未来某个时候被调用。”并查看视图源代码指出'onDraw'从'draw'被调用,紧接着'dispatchDraw'将被调用,你可以看到[here](http://grepcode.com/file/repository.grepcode.com /java/ext/com.google.android/android/2.0_r1/android/view/View.java#View.draw%28android.graphics.Canvas%29)。 – ebarrenechea 2013-02-22 15:25:20

+0

嗯,我第一次错过了源代码链接。我读过这个文档,看了看文档,它很有道理,但是我的onDraw方法并没有被调用!我在那里有一个日志语句,所以我可以看到它什么时候发生,但它从来没有写过..任何想法为什么ondraw不会被调用?视图是可见的,它是屏幕上的东西! – Josh 2013-02-22 16:21:16

0

invalidate()必须从UI线程调用,以引起onDraw()。尝试使用postInvalidate(),它应该与invalidate()具有相同的效果,但是适用于非UI线程。