一般圖形繪製都會用到雙緩衝,先在內存中繪製到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