[原创] 改善 Firemonkey Canvas 几何绘图质量问题(移动平台)
说明:Fiiremonkey 的跨平台能力,大家有目共睹(一码同介面跨四平台),唯独移动平台在几何绘图方面,质量始终不尽人意,我也曾试着去修正(如:),也曾找过第三方案(如:),但都不完美,我一直在想,移动平台有这么强的绘图能力及质量(Android & iOS),如果能直接拿来用,不是很好?为什么 Firemonkey 要自己重写? 目前网上许多针对此问题的改善方案,但多以控件形式,且需依各平台的绘图函数来绘图,或仅提供固定的几何图形控件,如果能延用现有的 TCanvas.Draw????? 绘图代码,只要加入几行代码(或编译开关),就能达到原生绘图的效果,岂不是很理想,于是开是构想这种方案的可行性,最后证实是可行的。 要先说明的是,这里提供的只是一种改善方案,而不是修正,最终还是希望能受到 EMB 官方的关注,由官方来改进这个问题。 用法及效果:FMX 的绘图方法: == == DesRect :=<span style="color: #000000"> Rect;
InflateRect(DesRect,-(Canvas.Stroke.Thickness / <span style="color: #800080">2),-(Canvas.Stroke.Thickness / <span style="color: #800080">2)); <span style="color: #008000">//<span style="color: #008000"> 线在区内 Canvas.FillRect(DesRect,<span style="color: #800080">30,AllCorners,<span style="color: #800080">1<span style="color: #000000">); Canvas.DrawRect(DesRect,<span style="color: #800080">30,<span style="color: #800080">1<span style="color: #000000">); <span style="color: #0000ff">end;
<span style="color: #cccccc">procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var Rect,DesRect: TRectF; begin Rect := PaintBox1.LocalRect; Canvas.Stroke.Thickness := 10; Canvas.Stroke.Kind := TBrushKind.Solid; Canvas.Stroke.Dash := TStrokeDash.DashDotDot; <span style="color: #008000">{<span style="color: #008000">$IFDEF UseNativeDraw<span style="color: #008000">}Canvas.NativeDraw(Rect,<span style="color: #0000ff">procedure <span style="color: #0000ff">begin <span style="color: #008000">{<span style="color: #008000">$ENDIF<span style="color: #008000">} <span style="color: #008000">//<span style="color: #008000"> 原生绘图 by Aone <span style="color: #cccccc"> DesRect := Rect; <span style="color: #008000">{<span style="color: #008000">$IFDEF UseNativeDraw<span style="color: #008000">}<span style="color: #0000ff">end);<span style="color: #008000">{<span style="color: #008000">$ENDIF<span style="color: #008000">} <span style="color: #008000">//<span style="color: #008000"> 原生绘图 by Aone 运作原理:
调用原生绘图的 TCanvas 函数:
|