我使用Firemonkey在Delphi XE5中创建了一个Android应用程序,对于我的其中一个窗体,我需要一个TImage来填充整个窗体,我可以在其上绘制它的位图。Delphi中的组件大小Android
我所做的是这样的:
我添加了一个TImage组件到我的形式,并设置它的阵营:= alClient。在设计器中它填充整个表单。
在我FORMCREATE过程我设置它的大小为TImage中的大小
procedure TDrawForm.FormCreate(Sender: TObject); begin Image1.Bitmap.SetSize(Trunc(Image1.Width), Trunc(Image1.Height)); DrawFromList(Image1); end;
然后我在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平板电脑上画得很好,但它并没有填满整个屏幕:
在第二张照片我用
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)。 – Daniel