一般图形绘制都会用到双缓冲,先在内存中绘制到bitmap中,然后再输出到界面中,可以不出现闪烁的情况。
本以为在FMX也是同样的套路。不然,发现Canvas永远是空白的,愣是不输出。国内资料基本为O,翻墙无数,得知Bitmap的绘制前后需要:
Bitmap.Canvas.BeginScene;
...
Bitmap.Canvas.EndScene;
在此之后需要BitmapChanged一下,然后再DrawBitmap到界面中。满心欢喜,结果却大失所望.
BitmapChanged在VCL的项目中有效,但是在FMX的框架中 已经被置为了Private,这在XE2中还是Public。难道是英巴卡迪诺开发人员开小差了?
在Quality Center中果然有人提了这个BUG, 不过至今还没有Fixed掉。
后来发现在DrawBitmap前后,分别对目标Canvas进行BeginScene, EndScene即可显示绘制内容。
代码结构如:
Bitmap.Canvas.BeginScene;
...
Bitmap.Canvas.EndScene;
Self.Canvas.BeginScene() ;
self.Canvas.DrawBitmap(Bitmap, RectF(0,0,500,500), RectF(0,0,500, 500), 1);
Self.Canvas.EndScene;
当然你可能发现,如果是在Paint事件中进行绘制,那么就不需要套上BeginScene,EndScene了。我想对于Paint事件,应该是进行过特殊处理。有机会可以把源代码挖出来看看。
-----------------
还有一个方法:TImageControl提供了bitmap,在上面绘制就是所绘即所得,不会出现明明绘制了,结果还是空白的情况。
参考链接:http://stackoverflow.com/questions/8336127/firemonkey-tbitmap-canvas-drawing-methods-have-no-visible-results-what-am-i-do