iOS上的FMX:如何执行部分失效?

当我使表单上的一个控件失效时, Paint表单上的所有控件都会调用Paint方法。 这发生在iOS上,而在Windows上,本地失效工作,只有被请求的控制被绘制。

为了validation这一点,我做了一个小小的testing程序,在TPaintBox上只有两个TPaintBox ,并为它们分配了这些Click和Paint方法:

 procedure TForm1.PaintBox1Click(Sender: TObject); var lPaintBox: TPaintBox; begin lPaintBox := TPaintBox(Sender); lPaintBox.InvalidateRect(lPaintBox.LocalRect); end; procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas); var lPaintBox: TPaintBox; begin lPaintBox := TPaintBox(Sender); lPaintBox.Canvas.Fill.Color := claBlack; lPaintBox.Canvas.FillText(RectF(0,0,50,50),'Paint count = '+inttostr(lPaintBox.Tag),true, 1, [], ttextAlign.Center); lPaintBox.Tag := lPaintBox.Tag +1; end; 

无论我触摸哪一个颜料盒,另一个也被涂上颜料。 所以在iOS上,他们总是显示相同的数字。

有没有办法避免这种情况?

我使用柏林更新2与XCode 8.2

UPDATE

进一步调查我发现InvalidateRect调用这个:

 procedure TCustomForm.AddUpdateRect(R: TRectF); begin ... if (Canvas <> nil) and not (TCanvasStyle.SupportClipRects in Canvas.GetCanvasStyle) then InvalidateRect(RectF(0, 0, FCanvas.Width, FCanvas.Height)) else InvalidateRect(R); end; 

这意味着如果Canvas不支持ClipRects,那么完整的表单将失效。 由于移动平台总是使用TCanvasGPU ,我检查了它支持的内容:

 class function TCanvasGpu.GetCanvasStyle: TCanvasStyles; begin Result := [TCanvasStyle.NeedGPUSurface]; end; 

换句话说,移动平台不(当前)支持本地失效,并且每当任何控制想要使任何事情失效时,总是重新绘制表单上的所有内容。

当表单上有很多和/或复杂的控件时,这是不幸的,所以可能会有解决方法吗?

Interesting Posts