この関数は DELPHI XE5 で作成しましたが、非常にうまく機能しています。すべてのアイコンを含む 1 つの画像を作成し、この画像を 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 の内部ペイントは更新されません。なんで ?