1

この関数は 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 の内部ペイントは更新されません。なんで ?

4

2 に答える 2

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

私のテストプロジェクトでは、それは機能しています。

これが別の開発者に役立つことを願っています。

于 2015-04-12T18:45:17.843 に答える
0

Canvas.BeginScene の戻りをテストしようとしましたか? 失敗した場合は、グラフィック コンテキスト システムが初期化に成功していないことを意味します。(はい、それは XE5 で動作し、おそらく他のものでも動作します。おそらく、init シーケンスがどこかで変更されている可能性があります) 作成フェーズでは、確かに異常ではありません。これを別の場所で行う必要があります。

于 2015-04-12T18:15:42.723 に答える