2013-10-18 22 views
2

我使用Firemonkey在Delphi XE5中创建了一个Android应用程序,对于我的其中一个窗体,我需要一个TImage来填充整个窗体,我可以在其上绘制它的位图。Delphi中的组件大小Android

我所做的是这样的:

  1. 我添加了一个TImage组件到我的形式,并设置它的阵营:= alClient。在设计器中它填充整个表单。

  2. 在我FORMCREATE过程我设置它的大小为TImage中的大小

    procedure TDrawForm.FormCreate(Sender: TObject); 
    begin 
        Image1.Bitmap.SetSize(Trunc(Image1.Width), Trunc(Image1.Height)); 
        DrawFromList(Image1); 
    end; 
    
  3. 然后我在TImage中的Bitmap.Canvas画初始化TImage中的位图

    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平板电脑上画得很好,但它并没有填满整个屏幕:

enter image description here

在第二张照片我用

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过程中的位图大小,但这并没有什么区别。

+0

TImage确实是FormCreate中的最终尺寸,还是再次调整以适应以后?在FormCreate中,记录TImage的大小,然后再做。无论如何,如果是这种情况,而不是调整位图大小,请尝试使用'TImage.WrapMode'来自动缩放图像。 –

+0

@MarcusAdams我做了一个打印出值的按钮,它们不会改变。所以我会说TImage已经在FormCreate中已经有了最终的尺寸。请注意,Screen.Size属性也给出奇怪的数字(600 x 905而不是800 x 1280)。 – Daniel

回答

2

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

Image1.Scene.GetSceneScale 
Image1.Canvas.Scale 

就我而言,我不得不初始化我的位图是这样的:

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

这使我的图像1的位图,因为图像设置对齐填充整个屏幕:= alClient。

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