2

Firemonkey を使用して Delphi XE5 で Android アプリを作成しています。フォームの 1 つで、ビットマップ上に描画できるフォーム全体を埋める TImage が必要です。

私がしたことはこれでした:

  1. フォームに TImage コンポーネントを追加し、それを Align := alClient に設定しました。デザイナーでは、フォーム全体を埋めます。

  2. 私の FormCreate 手順では、サイズを TImage のサイズに設定して、TImage のビットマップを初期化しました。

    procedure TDrawForm.FormCreate(Sender: TObject);
    begin
        Image1.Bitmap.SetSize(Trunc(Image1.Width), Trunc(Image1.Height));
        DrawFromList(Image1);
    end;
    
  3. 次に、TImage の Bitmap.Canvas に描画します

    procedure TDrawForm.DrawFromList(image: TImage);
    var draw: TDraw;
    begin
       image.Bitmap.Canvas.BeginScene;
       image.Bitmap.Canvas.Clear(claBlue);
       image.Bitmap.Canvas.Stroke.Color := claBlack;
       image.Bitmap.Canvas.Fill.Color := claYellow;
       for draw in DrawList do
       begin
          image.Bitmap.Canvas.FillPath(draw.fpath, 1);
          image.Bitmap.Canvas.DrawPath(draw.fpath, 1);
       end;
       image.Bitmap.Canvas.EndScene;
    end;
    

このコードは私の Nexus 7 タブレットでは問題なく描画されますが、画面全体には表示されません。

ここに画像の説明を入力

私が使用した2番目の写真で

Image1.Bitmap.SetSize(Trunc(Image1.Width * 1.34), Trunc(Image1.Height * 1.34));

1.34 は試行錯誤の結果、画面全体に表示されるようになりました。

次に、画像と画面のサイズを印刷しようとしました。Nexus 7 (1280 x 800 ピクセル) の場合、画面全体を占める TImage コンポーネントの幅は 601、高さは 880 です。したがって、ビットマップのサイズを TImage のサイズに設定すると、ビットマップも 601 x 880 です。これが、ビットマップを拡大して画面全体に表示する必要がある理由を説明しています。画面サイズは 600 x 905 として報告されます (Screen.Size を使用)。

私の質問は、デバイスの実際の解像度が 800 x 1280 であるのに、TImage コンポーネントのサイズが 601 x 880 (および画面のみ 600 x 905) しかないのはなぜですか? これらのサイズがピクセルでない場合、それらは何ですか? さらに重要なことに、これらの数値を実際の画面ピクセルに変換するにはどうすればよいですか (1.34 は Nexus 7 でのみ機能することに注意してください。私の HTC Sensation では、さらに大きくする必要がありました)。

同僚の 1 人が、画面の DPI に関係があるのではないかと提案しましたが、現在のデバイスの DPI を取得できる方法が見つかりませんでした。

FormResize プロシージャでビットマップのサイズを更新しようとしましたが、違いはありません。

4

1 に答える 1

2

問題の解決策を見つけました。どうやら、コンポーネントには、スケールを返す 2 つのプロパティがあります。幸いなことに、このスケールにコンポーネントの幅と高さを掛けると、幅と高さがピクセル単位で返されます。

Image1.Scene.GetSceneScale
Image1.Canvas.Scale

私の場合、次のようにビットマップを初期化する必要がありました。

Image1.Bitmap.SetSize(Trunc(Image1.Width * Image1.Canvas.Scale), 
                      Trunc(Image1.Height * Image1.Canvas.Scale));

これにより、イメージが Align := alClient に設定されているため、Image1 のビットマップが画面全体に表示されます。

Image1.Width と Image1.Height (またはそのことについては Screen.Size) によって返される元のサイズがどのように測定されるかはまだわかりませんが、常にピクセルであるとは限りません。これがどこかに文書化されていれば、約 2 週間の頭痛の種から解放されたでしょう。

于 2013-10-25T08:31:06.317 に答える