【发布时间】:2015-04-12 01:01:22
【问题描述】:
我在DELPHI XE5上创建了这个功能,效果很好。 您使用所有图标创建一个图像,将此图像加载到 TBitmap(在我的示例中为 IDE)中,并在表单中创建许多小 TRECTANGLE。
在onCreate期间,我调用Mapping方法来设置每个Trectangle的背景。
但在 DELPHI XE8 中,它不适用于 ANDROID
这是映射函数。
Procedure TForm1.Mapping(Const Obj:TRectangle;Const ofx,ofy:Integer);
Var
Arect : TRectF;
FBitmap : TBitmap;
Begin
Arect:=TRectF.Create(0,0,Obj.Width,Obj.Height);
Obj.Stroke.Kind := TBrushKind.None;
Obj.Fill.Kind := TBrushKind.Bitmap;
Obj.Fill.Bitmap.WrapMode := TWrapMode.TileOriginal;
//Create Crop Bitmap
FBitmap:=TBitmap.create( Round(Obj.Width), Round(Obj.Height)) ;
Try
FBitmap.Canvas.BeginScene();
FBitmap.Canvas.ClearRect(ARect,StringToAlphaColor('$00000000'));
FBitmap.Canvas.DrawBitmap(IDE,
TRectF.Create(ofx,ofy,ofx+Obj.Width,ofy+Obj.Height),
Arect, 100) ;
FBitmap.Canvas.EndScene;
//Assign Crop image to Rectangle object
Obj.Fill.Bitmap.Bitmap.Assign(FBitmap);
Finally
FBitmap.Free;
End;
End;
图片 (delphiXE.png) 正在“asset/internal”中部署,并在 oncreate 中打开。
procedure TForm1.FormCreate(Sender: TObject);
Var Mfile:String;
begin
IDE := TBitmap.Create(ClientWidth,ClientHeight);
{$IFDEF ANDROID}
Mfile:=TPath.Combine(TPath.GetDocumentsPath, 'delphiXE.png');
{$ELSE}
Mfile:=TPath.Combine(ExtractFilePath(ParamStr(0)), 'delphiXE.png');
{$ENDIF}
If FileExists(MFile)
Then begin
IDE.LoadFromFile(MFile);
Mapping(Logo,0,0);
End
Else ShowMessage('NO '+MFile);
end;
在 Windows 中,一切正常,但在 Android 中没有,但如果我使用 Mapping(Logo,0,0) 添加一个简单的 onclick 事件;调用,映射工作,但我需要先点击灰色的 Trectangle 将其设置为背景
有什么想法吗?
更新: 使用定时器,映射功能正常工作,trectangle 有很好的图片,但如果我切换到另一个应用程序并返回我的应用程序,图片会消失,trectangle 会变回纯灰色。
这意味着 TRectangle 的内部绘制没有更新。为什么?
【问题讨论】:
-
它是如何“不工作”的?它是否显示出意想不到的东西?它什么都不显示吗?它会给你一个错误吗?是不是编译失败了?
-
XE5 在 Android 上是否有效?
-
@David 根据问题,是的。
-
表格中trectangle用纯色(灰色)填充,一般在应用初始化时,填充参数变为bitmap,映射函数创建需要的bitmap。
-
它可以在带有 XE5、Windows XE5、Windows XE8 的 Android 上工作,但不能在带有 XE8 的 Android 上工作(可能也在 XE7 中)。我可以发布我的测试项目
标签: android delphi firemonkey delphi-xe8