DELPHI XE8:在OnCreate事件期间,Android上的TRectangle没有刷新

时间:2015-04-12 01:01:22

标签: android delphi firemonkey delphi-xe8

我在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中,Everythings工作正常,但在Android中没有,但如果我添加一个带有Mapping(Logo,0,0)的简单onclick事件;调用,映射工作,但我需要先点击灰色Trectangle来设置它背景

有什么想法吗?

更新: 使用定时器,映射功能正常工作,trectangle具有良好的画面,但如果我切换到另一个应用程序并返回我的应用程序,图片消失,Trectangle变回纯灰色。

这意味着TRectangle的内部绘制不会更新。为什么?

2 个答案:

答案 0 :(得分:3)

感谢您的帮助,我找到了解决方案和问题的根源。

Trectangle中的图片并不持久的事实对我有帮助。

//Assign  Crop  image to Rectangle objects 
Obj.Fill.Bitmap.Bitmap.Assign(FBitmap);

不再适用于Android上的DELPHI XE5。它复制位图但不是持久的方式。这就是为什么它使用onclick,但在我切换应用程序时消失了。

所以,我改变了这一行

// Force the size of TRectangle internal Bitmap
Obj.Fill.Bitmap.Bitmap.SetSize(FBitmap.Width,FBitmap.Height);
// Copy the crop bitmap in TRectangle Internal Bitmap
Obj.Fill.Bitmap.Bitmap.CopyFromBitmap(FBitmap);

在我的TEST PROJECT中,它正在工作。

我希望这可以帮助另一位开发者。

答案 1 :(得分:0)

您是否尝试过测试Canvas.BeginScene的返回?如果它失败,那意味着图形上下文系统没有成功初始化。 (是的,那可以在XE5上工作,也许还有其他的,去看看,他们可能会改变某处的init序列) 在创作阶段,肯定没有异常。 你应该在其他地方这样做。