gpt4 book ai didi

android - 图片在 Android 上无法正确显示

转载 作者:行者123 更新时间:2023-11-29 02:18:46 25 4
gpt4 key购买 nike

我在 Android 上无法正确显示图像时遇到 FMX 问题。

我的应用程序是我的第一个 Android 应用程序,它有一个背景和启动图像,在应用程序启动时显示。启动画面显示在所有内容之上,然后计时器让它消失,并显示背景。

Memu 模拟器的屏幕截图:

image

手机截图:

image

来自重复问题的来源:

http://anbech.me/bgtest/bg_test.zip

我从 Delphi 6 开始就开始编写 Pascal 代码,在此之前我从未询问过任何与代码相关的问题,但这对我来说非常陌生。

到目前为止,我已经尝试了 3 天让它工作,但没有成功。

目前我正在使用 RCDATA 资源并从那里加载图像。我什至尝试将图像设置为与其他 TImage 组件不同的形式,并从那里加载。我还注意到,如果图像设置为 Align=ClientWrapMode=Center,那么它们都会错位在 MainForm 上,但是在其他形式上效果很好。所以现在,我尝试裁剪图像,它们是正方形,因此它们将具有与其运行的设备相同的纵横比。

我可以继续说下去,因为到目前为止我尝试的是长篇大论。

procedure TForm1.FormShow(Sender: TObject);
var
Bmp, BmpSplash: TBitmap;
iRect: TRect;
begin
Load_image_from_resource(Form1.Image_bg, '0_bg');
Load_image_from_resource(Form1.Image_splash, '0_splash');

Bmp := TBitmap.Create;
try
Bmp.Width := round(Form1.Image_bg.Bitmap.Width * (Form1.ClientWidth / Form1.ClientHeight));
Bmp.Height := round(Form1.Image_bg.Bitmap.Height);
iRect.Width := round(Form1.Image_bg.Bitmap.Width * (Form1.ClientWidth / Form1.ClientHeight));
iRect.Height := Bmp.Height;
iRect.Left := round((iRect.Height - iRect.Width) / 2);
iRect.Top := 0;
Bmp.CopyFromBitmap(Form1.Image_bg.Bitmap, iRect, 0, 0);
//Form1.Image_bg.Bitmap := nil;
Form1.Image_bg.Bitmap.Assign(Bmp);
Form1.Image_bg.Align := TAlignLayout.Client;
Form1.Image_bg.WrapMode := TImageWrapMode.Stretch;
finally
Bmp.DisposeOf;
Bmp := nil;
end;

BmpSplash := TBitmap.Create;
try
BmpSplash.Width := round(Form1.Image_splash.Bitmap.Width * (Form1.ClientWidth / Form1.ClientHeight));
BmpSplash.Height := round(Form1.Image_splash.Bitmap.Height);
iRect.Width := round(Form1.Image_splash.Bitmap.Width * (Form1.ClientWidth / Form1.ClientHeight));
iRect.Height := Bmp.Height;
iRect.Left := round((iRect.Height - iRect.Width) / 2);
iRect.Top := 0;
BmpSplash.CopyFromBitmap(Form1.Image_splash.Bitmap, iRect, 0, 0);
//Form1.Image_splash.Bitmap := nil;
Form1.Image_splash.Bitmap.Assign(BmpSplash);
Form1.Image_splash.Align := TAlignLayout.Client;
Form1.Image_splash.WrapMode := TImageWrapMode.Stretch;
finally
BmpSplash.DisposeOf;
BmpSplash := nil;
end;

Form1.Image_bg.SendToBack;
Form1.Image_bg.Visible := False;
Form1.Image_splash.BringToFront;
Form1.Image_splash.Visible := True;
Form1.Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.Timer1.Enabled := False;
Form1.Image_bg.Visible := True;
Form1.Image_splash.Visible := False;
end;

最佳答案

你非常接近,我认为 Delphi 代码中的以下特性可能让你最头疼:

在你的代码中你有这样的东西:

iRect.Width := ...
iRect.Height := ...
iRect.Left := ...
iRect.Top := ...

TRect(或 TRectF)由其四个属性决定:Left、Top、Right、Bottom。当您使用 width(和 height)更改尺寸时,您调用此 setter 过程:

// This is the code in XE7, I do not know if it has been changed later
procedure TRect.SetWidth(const Value: Integer);
begin
Self.Right := Self.Left + Value;
end;

SetHeight 非常相似。

当您更改LeftTop 时,相应的字段会简单地更改,但不会更改RightBottom。结果是 widthheight 也改变了。

想象一个本地未初始化变量 iRect,它可能具有 LeftRight 的任何值。您上面的代码可能以非常奇怪的 TRect 矩形结束。解决方法是先设置 LeftTop 属性,然后设置 RightTopWidth高度

要显示图像,您需要它遵循纵横比,这意味着在垂直显示时需要从图像的两侧切开切片(水平显示时需要从顶部和底部切开)。我用 iRect 做了这个,所以它被初始化为屏幕大小,然后偏移屏幕大小和图像大小之间的一半差异。

这是根据屏幕尺寸显示图像的代码。这里只是垂直显示,但水平将遵循相同的方案。为简洁起见,我也没有包括初始图像,使用相同的代码和您自己的更改逻辑。代码中的注释应该解释我的想法。如您所见,它与您的非常相似,您对 iRect.WidthiRect.Left 的计算不正确,可能是因为 TRect 特点。

// I feel more comfortable with a bmp as temporary storage than the TImage, therefore this minor mod
procedure Load_Bitmap_From_Resource(var bmp: TBitmap; res_name: String);
var InStream: TResourceStream;
begin
InStream := TResourceStream.Create(HInstance, res_name, RT_RCDATA);
try
Bmp.LoadFromStream(InStream);
finally
InStream.Free;
end;
end;

procedure TForm1.FormShow(Sender: TObject);
var
ScrHeight, ScrWidth: integer;
bmp, bmp2, BmpSplash: TBitmap;
iRect: TRect;
begin
// Form1 acted for me also as a simulation form during dev, therefore
// these settings are not meant to be included in actual application
// ***********
self.Left := 0; self.ClientWidth := 270;
self.Top := 0; self.ClientHeight := 540;
// ***********

// Use FireMonkey Platform Services, IFMXScreeService to get real size of screen
ScrHeight := 2160; // just arbitrary examples, ..
ScrWidth := 1080; // ..for testing use size of your own phone

// I feel more comfortable with a bmp as temporary storage than the TImage
bmp := TBitmap.Create;
try
Load_Bitmap_From_Resource(bmp, '0_bg');

iRect := Rect(Point(0, 0), Point(ScrWidth, ScrHeight));
iRect.Offset((bmp.Width-ScrWidth) div 2, (bmp.Height-ScrHeight) div 2);

bmp2 := TBitmap.Create;
try
bmp2.SetSize(iRect.Width, iRect.Height);
bmp2.CopyFromBitmap(bmp, iRect, 0, 0);
Form1.Image_bg.Bitmap.Assign(bmp2);
Form1.Image_bg.Align := TAlignLayout.Client;
finally
bmp2.DisposeOf;
end;
finally
bmp.DisposeOf;
end;

Form1.Image_bg.Visible := True;
end;

关于android - 图片在 Android 上无法正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57796948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com