[FMX] 使用 Canvas 计算大小与物理大小计算时,别忘了缩放比

FMX 的 Canvas 的功能就不说了,但你注意到了吗?Canvas.TextWidth 等函数返回的大小,如果你当真,那你就会发现现实和理想差的太远了。你需要通过控件的 Scene.GetSceneScale 来获得一个缩放比,与原始的进行缩放后,才是放到屏幕上的实际大小。

一个简单的例子,我们计算一个Label上文字的显示区域大小:

var
  R: TRectF;
  AScale: Single;
begin
  R := TRectF.Create(0, 0, MaxInt, MaxInt);
  Label1.Canvas.MeasureText(R,Label1.Text,Label1.WordWrap,[],Label1.TextAlign,TTextAlign.Leading);  
  AScale := Label1.Scene.GetSceneScale;
  R.Right := R.Right * AScale;
  R.Bottom := R.Bottom * AScale;
  ShowMessage('Label1.Text.Width='+FloatToStr(R.Right)+'x'+FloatToStr(R.Bottom));
end;

上面的 R.Right 和 R.Bottom 需要乘上 AScale 才是真正的物理像素大小。

分享到: