Firemonkey を使用して Delphi XE5 で Android アプリを作成しています。フォームの 1 つで、ビットマップ上に描画できるフォーム全体を埋める TImage が必要です。
私がしたことはこれでした:
フォームに TImage コンポーネントを追加し、それを Align := alClient に設定しました。デザイナーでは、フォーム全体を埋めます。
私の FormCreate 手順では、サイズを TImage のサイズに設定して、TImage のビットマップを初期化しました。
procedure TDrawForm.FormCreate(Sender: TObject); begin Image1.Bitmap.SetSize(Trunc(Image1.Width), Trunc(Image1.Height)); DrawFromList(Image1); end;
次に、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 プロシージャでビットマップのサイズを更新しようとしましたが、違いはありません。