我正在使用 Firemonkey 在 Delphi XE5 中创建一个 Android 应用程序,对于我的一个表单,我需要一个 TImage 来填充整个表单,我可以在其位图上进行绘制。
我所做的是:
我在表单中添加了一个 TImage 组件,并将其设置为 Align := alClient。在设计器中,它填充了整个表单。
在我的 FormCreate 过程中,我通过将 TImage 的位图的大小设置为 TImage 的大小来初始化它
procedure TDrawForm.FormCreate(Sender: TObject); begin Image1.Bitmap.SetSize(Trunc(Image1.Width), Trunc(Image1.Height)); DrawFromList(Image1); end;
然后我在 TImage 的 Bitmap.Canvas 上绘图
procedure TDrawForm.DrawFromList(image: TImage); var draw: TDraw; begin image.Bitmap.Canvas.BeginScene; image.Bitmap.Canvas.Clear(claBlue); image.Bitmap.Canvas.Stroke.Color := claBlack; image.Bitmap.Canvas.Fill.Color := claYellow; for draw in DrawList do begin image.Bitmap.Canvas.FillPath(draw.fpath, 1); image.Bitmap.Canvas.DrawPath(draw.fpath, 1); end; image.Bitmap.Canvas.EndScene; end;
这段代码在我的 Nexus 7 平板电脑上绘制得很好,但它没有填满整个屏幕:
在我使用的第二张图片中
Image1.Bitmap.SetSize(Trunc(Image1.Width * 1.34), Trunc(Image1.Height * 1.34));
通过反复试验找到1.34,使其填满整个屏幕。
然后我尝试打印出图像和屏幕的尺寸。对于我的 Nexus 7(1280 x 800 像素),TImage 组件填充整个屏幕,宽度为 601,高度为 880。因此,当我将位图的大小设置为 TImage 的大小时,位图也是 601 x 880,这解释了为什么我需要缩放位图以使其填满整个屏幕。屏幕尺寸报告为 600 x 905(使用 Screen.Size)。
我的问题是为什么我的设备实际分辨率是800 x 1280时,TImage组件的尺寸只有601 x 880(而屏幕只有600 x 905)?如果这些尺寸不是像素,那么它们是什么?更重要的是,如何将这些数字转换为实际屏幕像素(请记住,1.34 仅适用于 Nexus 7 - 在我的 HTC Sensation 上,它需要更大)?
我的一位同事建议这可能与屏幕的 DPI 有关,但我找不到任何方法可以为我提供当前设备的 DPI。
我也尝试过在 FormResize 过程中更新位图的大小,但这没有什么区别。
最佳答案
我找到了解决问题的方法。显然,组件上有两个属性将返回比例。幸运的是,这个比例乘以组件的宽度和高度将返回宽度和高度以像素为单位。
Image1.Scene.GetSceneScale
Image1.Canvas.Scale
就我而言,我必须像这样初始化我的位图:
Image1.Bitmap.SetSize(Trunc(Image1.Width * Image1.Canvas.Scale),
Trunc(Image1.Height * Image1.Canvas.Scale));
这使得我的 Image1 的位图填满整个屏幕,因为图像设置为 Align := alClient。
我仍然不知道 Image1.Width 和 Image1.Height(或 Screen.Size)返回的原始尺寸是多少,但它并不总是像素。如果这在某个地方被记录下来,我会避免大约两周的头痛。
关于android - Delphi Android 中的组件尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19449501/