- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Android 上无法正确显示图像时遇到 FMX 问题。
我的应用程序是我的第一个 Android 应用程序,它有一个背景和启动图像,在应用程序启动时显示。启动画面显示在所有内容之上,然后计时器让它消失,并显示背景。
Memu 模拟器的屏幕截图:
手机截图:
来自重复问题的来源:
http://anbech.me/bgtest/bg_test.zip
我从 Delphi 6 开始就开始编写 Pascal 代码,在此之前我从未询问过任何与代码相关的问题,但这对我来说非常陌生。
到目前为止,我已经尝试了 3 天让它工作,但没有成功。
目前我正在使用 RCDATA
资源并从那里加载图像。我什至尝试将图像设置为与其他 TImage
组件不同的形式,并从那里加载。我还注意到,如果图像设置为 Align=Client
和 WrapMode=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
非常相似。
当您更改Left
或Top
时,相应的字段会简单地更改,但不会更改Right
或Bottom
。结果是 width
或 height
也改变了。
想象一个本地未初始化变量 iRect
,它可能具有 Left
和 Right
的任何值。您上面的代码可能以非常奇怪的 TRect
矩形结束。解决方法是先设置 Left
和 Top
属性,然后设置 Right
和 Top
或 Width
和 高度
。
要显示图像,您需要它遵循纵横比,这意味着在垂直显示时需要从图像的两侧切开切片(水平显示时需要从顶部和底部切开)。我用 iRect
做了这个,所以它被初始化为屏幕大小,然后偏移屏幕大小和图像大小之间的一半差异。
这是根据屏幕尺寸显示图像的代码。这里只是垂直显示,但水平将遵循相同的方案。为简洁起见,我也没有包括初始图像,使用相同的代码和您自己的更改逻辑。代码中的注释应该解释我的想法。如您所见,它与您的非常相似,您对 iRect.Width
和 iRect.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/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!