【问题标题】:DELPHI XE8 : No refresh for TRectangle on Android during OnCreate eventDELPHI XE8:在 OnCreate 事件期间,Android 上的 TRectangle 没有刷新
【发布时间】: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


【解决方案1】:

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

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);

在我的测试项目中,它正在工作。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我在时间位图中使用 BeginScene(用于裁剪),结果它总是正确的。谢谢你的想法。
    猜你喜欢
    • 1970-01-01
    • 2020-05-08
    • 2023-03-13
    • 2011-03-30
    • 2015-10-08
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多