Delphi Android中的组件大小

我使用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
    

    在我的情况下,我必须像这样初始化我的Bitmap:

    Image1.Bitmap.SetSize(Trunc(Image1.Width * Image1.Canvas.Scale), 
                          Trunc(Image1.Height * Image1.Canvas.Scale));
    

    由于图像设置为Align:= alClient,这使得我的Image1的位图填充整个屏幕。

    我仍然不知道Image1.Width和Image1.Height(或Screen.Size)返回的原始尺寸是以什么为单位进行测量的,但它并不总是像素。 如果记录在某个地方,它会救了我大约两周的头痛。

    链接地址: http://www.djcxy.com/p/96691.html

    上一篇: Component sizes in Delphi Android

    下一篇: When I run iPhone app on iPad the screen resolution is wrong. How to fix this?