Създавам приложение за Android в Delphi XE5 с помощта на Firemonkey и за един от моите формуляри имам нужда от TImage, който ще запълни целия формуляр, където мога да рисувам върху неговата Bitmap.
Това, което направих, беше следното:
Добавих компонент TImage към моя формуляр и му зададох Align := alClient. В дизайнера запълва цялата форма.
В моята процедура FormCreate инициализирах Bitmap на TImage, като зададох размера му на размера на TImage
procedure TDrawForm.FormCreate(Sender: TObject); begin Image1.Bitmap.SetSize(Trunc(Image1.Width), Trunc(Image1.Height)); DrawFromList(Image1); end;
След това рисувам върху Bitmap.Canvas на TImage
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, но не запълва целия екран:
На втората снимка използвах
Image1.Bitmap.SetSize(Trunc(Image1.Width * 1.34), Trunc(Image1.Height * 1.34));
където 1.34 беше намерен чрез проба и грешка, за да запълни целия екран.
След това се опитах да отпечатам размера на изображението и екрана. За моя Nexus 7 (който е 1280 x 800 пиксела) компонентът TImage, който запълва целия екран, има ширина 601 и височина 880. Така, когато задам размера на Bitmap да бъде размера на моя TImage, растерното изображение също е 601 x 880, което обяснява защо трябваше да мащабирам растерното изображение, за да запълни целия екран. Размерът на екрана се отчита като 600 x 905 (с помощта на Screen.Size).
Моят въпрос е защо размерът на компонента TImage е само 601 x 880 (а екранът само 600 x 905), когато действителната разделителна способност на моето устройство е 800 x 1280? Ако тези размери не са пиксели, тогава какви са? И което е по-важно, как да преобразувам тези числа в реални пиксели на екрана (имайте предвид, че 1.34 работи само за Nexus 7 - на моя HTC Sensation трябваше да е още по-голям)?
Един от моите колеги предположи, че това може да е свързано с DPI на екрана, но не можах да намеря никакъв метод, който да ми даде DPI на текущото устройство.
Също така се опитах да актуализирам размера на растерното изображение в процедурата FormResize, но това не прави разлика.
TImage.WrapMode
за автоматично мащабиране на изображението. - person Marcus Adams   schedule 18.10.2013