#delphi #firemonkey #rad-studio
#delphi #firemonkey #rad-studio
Вопрос:
Я создаю простое приложение для рисования с помощью FireMonkey и Delphi. Все, что он действительно делает, это рисует линии и эллипсы. Это код:
Image1.Bitmap.Canvas.BeginScene;
with Form1 do begin
for i := 0 to 360 do
if (i mod 15)=0 then
begin
p1 := TPointF.Create(PX, PY);
p2 := TPointF.Create(Round(PX 200*sin(i*pi/180)), Round(PY 200*cos(i*pi/180)));
Image1.Bitmap.Canvas.DrawLine(p1, p2, 100);
end;
for i := 0 to 200 do
if (i mod 20)=0 then
begin
prst1 := TRectF.Create(PX i,PY i,PX-i,PY-i);
Image1.Bitmap.Canvas.DrawEllipse(prst1, 100);
end;
Image1.Bitmap.Canvas.EndScene;
end;
Этот код отлично работает, когда я компилирую его под Win32 или Win64. Но когда я пытаюсь скомпилировать его и запустить на устройстве Android, отображаются только строки, а многоточия просто отсутствуют. У кого-нибудь есть идеи, почему это происходит?
Заранее благодарю вас за вашу помощь!
Комментарии:
1. Рисование внутри элемента управления image на самом деле не является правильным способом рисования на экране. Попробуйте рисовать непосредственно на холсте формы из
OnPaint
обработчика событий формы.2. Пожалуйста, всегда предоставляйте подробную информацию, такую как инициализация переменных и их типы. Например. Какое значение имеют
PX
иPY
при вводе? Что, если они окажутся 123456? Каков контекст кода? Обработчик событий? Ваш определенный метод? Каковы значенияbrush
иstroke
свойств? Дополнительный вопрос: каково значение непрозрачности для полностью непрозрачной линии?3. @TomBrunberg Прошу прощения за это. Оба
PX
иPY
имеют размер 200, аTImage
— 400×400, так что на самом деле они просто представляют центрTImage
. Код находится вButtonClick
процессе — я просто хочу нарисовать поверхность, подобную радару, на изображении. Затем я рисую на нем траектории. У меня просто есть значения свойствstroke
иcolor
, они3
дляstroke
иTAlphaColors.Black
дляcolor
. Значение непрозрачности в инспекторе объектов дляTImage
равно1
(если это то, о чем вы спрашиваете).4. У меня просто проблема с пониманием того, почему один и тот же код FireMonkey работает под Win32, но не работает под Android. Я довольно новичок в Delphi и полагал, что один и тот же код будет работать одинаково в обоих из них. Embarcadero wiki на самом деле не так уж полезен для меня с моими ограниченными знаниями. Будет ли использование TPaintBox лучше, чем TImage в моей ситуации, когда я хочу нарисовать на нем несколько траекторий (поэтому редактирую его в цикле, который работает примерно на 1000 шагов)?
5. Спасибо, что ответили на мой комментарий, но, пожалуйста, добавьте эту информацию к вашему вопросу, здесь, в комментариях, это так легко упустить из виду. Мой вопрос относительно непрозрачности вытекает из вашей строки:
Image1.Bitmap.Canvas.DrawLine(p1, p2, 100);
. Третий параметр — это непрозрачность, 0 ..1.0 согласно документам, но хорошо, все, что выше 1.0, считается 1.0.
Ответ №1:
Вы можете рисовать на Form.Canvas
в OnPaint
обработчике событий. Вот пример:
procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas;
const ARect: TRectF);
begin
with Canvas do begin
BeginUpdate;
try
Stroke.Kind := TBrushKind.Solid;
Stroke.Thickness := 2.0;
DrawEllipse(ARect,1);
DrawLine(PointF(ARect.Left,ARect.Height / 2), PointF(ARect.right,ARect.Height / 2), 1);
DrawLine(PointF(ARect.Left (ARect.Width / 2),ARect.Height), PointF(ARect.Left (ARect.Width / 2),0), 1);
finally
EndUpdate;
end;
end;
end;