【问题标题】:Component sizes in Delphi AndroidDelphi Android 中的组件大小
【发布时间】:2013-10-27 06:54:23
【问题描述】:

我正在使用 Firemonkey 在 Delphi XE5 中创建一个 Android 应用程序,对于我的一个表单,我需要一个 TImage 来填充整个表单,我可以在其中绘制位图。

我做的是这样的:

  1. 我在表单中添加了一个 TImage 组件并将其设置为 Align := alClient。在设计器中,它会填充整个表单。

  2. 在我的 FormCreate 过程中,我通过将 TImage 的大小设置为 TImage 的大小来初始化 TImage 的位图

    procedure TDrawForm.FormCreate(Sender: TObject);
    begin
        Image1.Bitmap.SetSize(Trunc(Image1.Width), Trunc(Image1.Height));
        DrawFromList(Image1);
    end;
    
  3. 然后我在 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 过程中更新位图的大小,但这并没有什么不同。

【问题讨论】:

  • TImage 真的是 FormCreate 中的最终大小,还是会再次调整以适应以后?在 FormCreate 中,记录 TImage 的大小,然后再做一次。无论如何,如果是这种情况,与其调整位图大小,不如尝试使用TImage.WrapMode 自动缩放图像。
  • @MarcusAdams 我做了一个按钮,打印出值,它们不会改变。所以我会说 TImage 的最终大小已经在 FormCreate 中。请注意,Screen.Size 属性也会给出奇怪的数字(600 x 905 而不是 800 x 1280)。

标签: android delphi size delphi-xe5


【解决方案1】:

我找到了解决问题的方法。显然,在组件上有两个属性会返回一个比例。幸运的是,这个比例乘以组件的宽度和高度将返回宽度和高度以像素为单位

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 )返回的原始尺寸是多少,但它并不总是像素。如果这被记录在某处,它会为我节省大约两周的头痛。

【讨论】:

    猜你喜欢
    • 2015-01-05
    • 2020-11-13
    • 2013-07-19
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多